# Productos API

> Mantén el catálogo de tu tienda en Emailit para las cuadrículas de productos, las recomendaciones y los artículos de los pedidos.

URL base: `https://api.emailit.com/v2`. Autentícate con `Authorization: Bearer <API key>`.

## Crear o actualizar un producto — POST /products

> Añade un producto a tu catálogo, o actualízalo, según el ID del producto en tu tienda. Alfa: solo para el equipo de Emailit.

# Crear o actualizar un producto

Añade un producto a tu catálogo, o actualízalo si ya existe un producto con el mismo `id`. El `id` es el ID del producto en tu tienda, así que puedes volver a enviar el mismo producto cada vez que cambie. Requiere una clave de API con el permiso `full` o `events`. Con una clave `events`, la respuesta solo contiene `object`, `id` y `external_id`.

> **Comercio electrónico está en alfa:** Comercio electrónico solo está abierto al equipo de Emailit mientras lo probamos. Las demás peticiones devuelven `403` con `error: "commerce_alpha"`. Las claves de API solo funcionan en los espacios de trabajo que pertenecen al equipo de Emailit. Consulta [Quién puede usar Comercio electrónico](/es/docs/commerce/#who-can-use-commerce).

`id` siempre es obligatorio, y `title` es obligatorio en un producto nuevo. Los campos solo se escriben si los envías, así que un producto que vuelves a enviar solo con un precio nuevo conserva su título, sus categorías, su imagen y todo lo demás. Para enviar muchos productos a la vez, usa [Crear o actualizar productos en bloque](/es/docs/api-reference/products/batch/).

Las cuadrículas de productos, las recomendaciones y los artículos de los pedidos en los emails se leen del catálogo. Consulta [Productos, cupones y el carrito](/es/docs/campaigns/products-and-coupons/).

`POST /products`

## Cuerpo de la petición

- `id` (string | number, obligatorio): El ID del producto en tu tienda, de hasta 255 caracteres. Los números se guardan como cadenas. Se guarda como `external_id`. También puedes enviarlo como `external_id`.

- `title` (string): El nombre del producto, de hasta 500 caracteres. También puedes enviarlo como `name`. Obligatorio en un producto nuevo.

- `sku` (string): La referencia de inventario (SKU), de hasta 255 caracteres.

- `description` (string): La descripción del producto, de hasta 10.000 caracteres.

- `url` (string): La página del producto en tu tienda. Una URL `http` o `https` de hasta 2048 caracteres.

- `image_url` (string): La imagen del producto. Una URL `http` o `https` de hasta 2048 caracteres.

- `price` (number | string): El precio actual, como número o como cadena numérica, por ejemplo `"89.00"`. No puede ser negativo. Se guarda con hasta 4 decimales.

- `compare_at_price` (number | string): El precio antes de un descuento, con el mismo formato que `price`. Si es mayor que `price`, el producto se considera en oferta.

- `currency` (string): El código ISO 4217 de tres letras, por ejemplo `USD` o `EUR`. Se aceptan minúsculas. Los emails muestran los precios del producto en esta moneda, o en USD si no está definida.

- `categories` (string[]): Hasta 50 nombres de categoría de hasta 191 caracteres cada uno. Los duplicados se eliminan.

- `brand` (string): El nombre de la marca, de hasta 191 caracteres.

- `inventory_quantity` (integer | null): Las unidades en inventario. `null` significa que no controlas el inventario. Las cuadrículas de productos de los emails omiten los productos con `0`.

- `status` (string): `active` o `archived`. Los productos nuevos están en `active`. Los productos archivados se ocultan por defecto en [Listar productos](/es/docs/api-reference/products/list/) y se omiten en las cuadrículas de productos.

- `metadata` (object): Tus propios datos de clave y valor, de hasta 16 KB en JSON. Si envías `metadata`, se sustituye el objeto guardado.

## Devuelve

`201 Created` con el [objeto de producto](/es/docs/api-reference/products/get/) si el producto es nuevo, o `200 OK` si se ha actualizado un producto existente. Devuelve `422` si un campo no es válido.
**Petición** `POST /products`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/products \
  -H "Authorization: Bearer your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "8123456789",
    "title": "Trail running shoe",
    "sku": "TRS-BLU-42",
    "url": "https://shop.example.com/products/trail-running-shoe",
    "image_url": "https://shop.example.com/images/trail-running-shoe.jpg",
    "price": 89,
    "compare_at_price": 119,
    "currency": "USD",
    "categories": ["Shoes", "Running"],
    "brand": "Acme Outdoors",
    "inventory_quantity": 34
  }'
```

**201**

```json
{
  "object": "product",
  "id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
  "external_id": "8123456789",
  "sku": "TRS-BLU-42",
  "title": "Trail running shoe",
  "description": null,
  "url": "https://shop.example.com/products/trail-running-shoe",
  "image_url": "https://shop.example.com/images/trail-running-shoe.jpg",
  "price": 89,
  "compare_at_price": 119,
  "currency": "USD",
  "categories": [
    "Shoes",
    "Running"
  ],
  "brand": "Acme Outdoors",
  "inventory_quantity": 34,
  "status": "active",
  "metadata": {},
  "created_at": "2026-10-08T14:21:07.512Z",
  "updated_at": "2026-10-08T14:21:07.512Z"
}
```

**422**

```json
{
  "message": "Validation failed. price: must not be negative",
  "errors": {
    "price": [
      "must not be negative"
    ]
  }
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/products/create/

## Obtener un producto — GET /products/{id}

> Obtén un producto de tu catálogo por su ID de Emailit o por el ID del producto en tu tienda. Alfa: solo para el equipo de Emailit.

# Obtener un producto

Obtén un producto por su ID de Emailit o por el ID del producto en tu tienda. Requiere una clave de API con el permiso `full`.

> **Comercio electrónico está en alfa:** Comercio electrónico solo está abierto al equipo de Emailit mientras lo probamos. Las demás peticiones devuelven `403` con `error: "commerce_alpha"`. Las claves de API solo funcionan en los espacios de trabajo que pertenecen al equipo de Emailit. Consulta [Quién puede usar Comercio electrónico](/es/docs/commerce/#who-can-use-commerce).

`GET /products/{id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID del producto (`prd_...`) o el ID del producto en tu tienda (`external_id`). Codifica para URL los ID de tienda que contengan caracteres especiales.

## Objeto de producto

- `object` (string): Siempre `product`.

- `id` (string): El ID de Emailit del producto (`prd_...`).

- `external_id` (string): El ID del producto en tu tienda: el `id` que enviaste. Los artículos de los pedidos y de los carritos hacen referencia a los productos con este ID.

- `sku` (string | null): La referencia de inventario (SKU).

- `title` (string): El nombre del producto.

- `description` (string | null): La descripción del producto.

- `url` (string | null): La página del producto en tu tienda.

- `image_url` (string | null): La imagen del producto.

- `price` (number | null): El precio actual.

- `compare_at_price` (number | null): El precio antes de un descuento. Un producto está en oferta si `compare_at_price` es mayor que `price`.

- `currency` (string | null): El código ISO 4217 de tres letras de los precios.

- `categories` (string[]): Los nombres de las categorías.

- `brand` (string | null): El nombre de la marca.

- `inventory_quantity` (integer | null): Las unidades en inventario. `null` significa que no se controla el inventario. Las cuadrículas de productos de los emails omiten los productos con `0`.

- `status` (string): `active` o `archived`. Las cuadrículas de productos de los emails omiten los productos archivados.

- `metadata` (object): Tus propios datos de clave y valor.

- `created_at` (string): Cuándo se añadió el producto, en formato ISO 8601 UTC.

- `updated_at` (string): Cuándo cambió el producto por última vez, en formato ISO 8601 UTC.

**Petición** `GET /products/{id}`

**cURL**

```bash
curl https://api.emailit.com/v2/products/prd_3r6HHUGUSl8yjYDscEA6aYA8wrA \
  -H "Authorization: Bearer your_api_key"
```

**200**

```json
{
  "object": "product",
  "id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
  "external_id": "8123456789",
  "sku": "TRS-BLU-42",
  "title": "Trail running shoe",
  "description": "Lightweight shoe with a grippy sole for wet trails.",
  "url": "https://shop.example.com/products/trail-running-shoe",
  "image_url": "https://shop.example.com/images/trail-running-shoe.jpg",
  "price": 89,
  "compare_at_price": 119,
  "currency": "USD",
  "categories": [
    "Shoes",
    "Running"
  ],
  "brand": "Acme Outdoors",
  "inventory_quantity": 34,
  "status": "active",
  "metadata": {
    "color": "blue"
  },
  "created_at": "2026-10-02T08:15:22.418Z",
  "updated_at": "2026-10-08T14:21:07.512Z"
}
```

**404**

```json
{
  "error": "Product not found",
  "message": "Product not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/products/get/

## Actualizar un producto — POST /products/{id}

> Cambia algunos campos de un producto de tu catálogo. Alfa: solo para el equipo de Emailit.

# Actualizar un producto

Actualiza un producto que ya está en tu catálogo. Solo cambian los campos que envías. El ID del producto en tu tienda no puede cambiar: se ignora cualquier `id` en el cuerpo. Requiere una clave de API con el permiso `full` o `events`. Con una clave `events`, la respuesta solo contiene `object`, `id` y `external_id`.

> **Comercio electrónico está en alfa:** Comercio electrónico solo está abierto al equipo de Emailit mientras lo probamos. Las demás peticiones devuelven `403` con `error: "commerce_alpha"`. Las claves de API solo funcionan en los espacios de trabajo que pertenecen al equipo de Emailit. Consulta [Quién puede usar Comercio electrónico](/es/docs/commerce/#who-can-use-commerce).

Para crear productos y actualizarlos con la misma llamada, usa [Crear o actualizar un producto](/es/docs/api-reference/products/create/).

`POST /products/{id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID del producto (`prd_...`) o el ID del producto en tu tienda.

## Cuerpo de la petición

Cualquiera de los campos de [Crear o actualizar un producto](/es/docs/api-reference/products/create/) salvo `id`: `title`, `sku`, `description`, `url`, `image_url`, `price`, `compare_at_price`, `currency`, `categories`, `brand`, `inventory_quantity`, `status` y `metadata`. Se aplican las mismas reglas. `categories` y `metadata` se sustituyen por completo.

## Devuelve

`200 OK` con el [objeto de producto](/es/docs/api-reference/products/get/) actualizado. Devuelve `404` si ningún producto coincide con `id` y `422` si un campo no es válido.
**Petición** `POST /products/{id}`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/products/8123456789 \
  -H "Authorization: Bearer your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "price": 79, "inventory_quantity": 20 }'
```

**200**

```json
{
  "object": "product",
  "id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
  "external_id": "8123456789",
  "sku": "TRS-BLU-42",
  "title": "Trail running shoe",
  "description": "Lightweight shoe with a grippy sole for wet trails.",
  "url": "https://shop.example.com/products/trail-running-shoe",
  "image_url": "https://shop.example.com/images/trail-running-shoe.jpg",
  "price": 79,
  "compare_at_price": 119,
  "currency": "USD",
  "categories": [
    "Shoes",
    "Running"
  ],
  "brand": "Acme Outdoors",
  "inventory_quantity": 20,
  "status": "active",
  "metadata": {
    "color": "blue"
  },
  "created_at": "2026-10-02T08:15:22.418Z",
  "updated_at": "2026-10-09T10:02:41.205Z"
}
```

**404**

```json
{
  "error": "Product not found",
  "message": "Product not found."
}
```

**422**

```json
{
  "message": "Validation failed. image_url: must be an http(s) URL",
  "errors": {
    "image_url": [
      "must be an http(s) URL"
    ]
  }
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/products/update/

## Listar productos — GET /products

> Lista los productos de tu catálogo, del más reciente al más antiguo, con filtros de búsqueda, categoría y estado. Alfa: solo para el equipo de Emailit.

# Listar productos

Lista los productos de tu catálogo, del más reciente al más antiguo. Sin `status`, solo se listan los productos activos. Requiere una clave de API con el permiso `full`.

> **Comercio electrónico está en alfa:** Comercio electrónico solo está abierto al equipo de Emailit mientras lo probamos. Las demás peticiones devuelven `403` con `error: "commerce_alpha"`. Las claves de API solo funcionan en los espacios de trabajo que pertenecen al equipo de Emailit. Consulta [Quién puede usar Comercio electrónico](/es/docs/commerce/#who-can-use-commerce).

`GET /products`

## Parámetros de consulta

- `page` (integer): El número de página (mínimo: 1; por defecto: 1).

- `limit` (integer): El número de productos que se devuelven (mínimo: 1; máximo: 100; por defecto: 25).

- `search` (string): Búsqueda sin distinguir entre mayúsculas y minúsculas en el título, el ID del producto en tu tienda (`external_id`) o el SKU.

- `category` (string): Solo los productos de esta categoría. El nombre debe coincidir exactamente, incluidas las mayúsculas y minúsculas.

- `status` (string): `active` (por defecto), `archived` o `all`. Usa `all` si filtras por la clave `status` que se describe más abajo, porque el valor por defecto ya limita la lista a los productos activos.

- `ids` (string): Una lista separada por comas de hasta 100 ID de producto. Cada uno puede ser el ID de Emailit (`prd_...`) o el ID del producto en tu tienda.

- `match` (string): `all` (por defecto) exige que coincidan todos los filtros `key.condition`. `or` exige que coincida cualquiera de ellos. Consulta [Filtrado](/es/docs/api-reference/filtering/).

- `sort` (string): El campo de ordenación: `created_at` (por defecto), `updated_at`, `title` o `price`.

- `order` (string): La dirección de ordenación: `asc` o `desc` (por defecto).

## Filtros

Claves de filtro y de ordenación: consulta [Filtrado](https://emailit.com/es/docs/api-reference/filtering/).

En este endpoint, `order` solo admite `asc` o `desc`. Indica el campo de ordenación en `sort`, por ejemplo `sort=price&order=asc`.

## Devuelve

Una página de [objetos de producto](/es/docs/api-reference/products/get/) en `data`, con `total_records`, `next_page_url` y `previous_page_url`. Las URL de las páginas solo llevan `page` y `limit`, así que vuelve a añadir tu búsqueda y tus filtros cuando las sigas.
**Petición** `GET /products`

**cURL**

```bash
curl "https://api.emailit.com/v2/products?category=Running&sort=price&order=asc&limit=25" \
  -H "Authorization: Bearer your_api_key"
```

**200**

```json
{
  "data": [
    {
      "object": "product",
      "id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
      "external_id": "8123456789",
      "sku": "TRS-BLU-42",
      "title": "Trail running shoe",
      "description": "Lightweight shoe with a grippy sole for wet trails.",
      "url": "https://shop.example.com/products/trail-running-shoe",
      "image_url": "https://shop.example.com/images/trail-running-shoe.jpg",
      "price": 89,
      "compare_at_price": 119,
      "currency": "USD",
      "categories": [
        "Shoes",
        "Running"
      ],
      "brand": "Acme Outdoors",
      "inventory_quantity": 34,
      "status": "active",
      "metadata": {
        "color": "blue"
      },
      "created_at": "2026-10-02T08:15:22.418Z",
      "updated_at": "2026-10-08T14:21:07.512Z"
    }
  ],
  "total_records": 1,
  "next_page_url": null,
  "previous_page_url": null
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/products/list/

## Crear o actualizar productos en bloque — POST /products/batch

> Envía hasta 1000 productos en una sola petición. Cada uno se crea o se actualiza según el ID del producto en tu tienda. Alfa: solo para el equipo de Emailit.

# Crear o actualizar productos en bloque

Envía hasta 1000 productos en una sola petición, por ejemplo para importar tu catálogo o para sincronizarlo de forma periódica. Cada producto sigue las reglas de [Crear o actualizar un producto](/es/docs/api-reference/products/create/): se crea o se actualiza según su `id`, un producto nuevo necesita un `title` y los campos solo se escriben si los envías. Requiere una clave de API con el permiso `full` o `events`. Con una clave `events`, la respuesta solo contiene `object`, `id` y `external_id`.

> **Comercio electrónico está en alfa:** Comercio electrónico solo está abierto al equipo de Emailit mientras lo probamos. Las demás peticiones devuelven `403` con `error: "commerce_alpha"`. Las claves de API solo funcionan en los espacios de trabajo que pertenecen al equipo de Emailit. Consulta [Quién puede usar Comercio electrónico](/es/docs/commerce/#who-can-use-commerce).

Los productos no válidos se omiten y se indican en `rejected`; los demás se guardan. La petición devuelve igualmente `200`.

`POST /products/batch`

## Cuerpo de la petición

- `products` (object[], obligatorio): De 1 a 1000 productos, cada uno con los campos de [Crear o actualizar un producto](/es/docs/api-reference/products/create/).

## Devuelve

- `created` (integer): El número de productos nuevos.

- `updated` (integer): El número de productos existentes que se han actualizado.

- `rejected` (object[]): Los productos que no se han guardado. Cada elemento tiene el `index` del producto en tu array `products` y `errors`, con la ruta del campo como clave, por ejemplo `products.3.price`.

Devuelve `422` si `products` está vacío o tiene más de 1000 elementos.
**Petición** `POST /products/batch`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/products/batch \
  -H "Authorization: Bearer your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "products": [
      { "id": "8123456789", "title": "Trail running shoe", "price": 89, "currency": "USD", "categories": ["Shoes", "Running"] },
      { "id": "8123456790", "title": "Merino running socks", "price": 18, "currency": "USD", "categories": ["Accessories"] },
      { "id": "8123456791", "price": 49, "currency": "USD" }
    ]
  }'
```

**200**

```json
{
  "created": 1,
  "updated": 1,
  "rejected": [
    {
      "index": 2,
      "errors": {
        "products.2.title": [
          "is required"
        ]
      }
    }
  ]
}
```

**422**

```json
{
  "message": "Validation failed. products: Send 1 to 1000 products.",
  "errors": {
    "products": [
      "Send 1 to 1000 products."
    ]
  }
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/products/batch/

## Listar las categorías de productos — GET /products/categories

> Lista las categorías de los productos activos de tu catálogo, con el número de productos de cada una. Alfa: solo para el equipo de Emailit.

# Listar las categorías de productos

Lista las categorías que usan los productos activos, en orden alfabético, con el número de productos activos de cada una. Los productos archivados no se cuentan. Devuelve hasta 1000 categorías y no tiene paginación. Requiere una clave de API con el permiso `full`.

> **Comercio electrónico está en alfa:** Comercio electrónico solo está abierto al equipo de Emailit mientras lo probamos. Las demás peticiones devuelven `403` con `error: "commerce_alpha"`. Las claves de API solo funcionan en los espacios de trabajo que pertenecen al equipo de Emailit. Consulta [Quién puede usar Comercio electrónico](/es/docs/commerce/#who-can-use-commerce).

Las categorías proceden del campo `categories` de cada producto. Usa el nombre de una categoría con el parámetro `category` de [Listar productos](/es/docs/api-reference/products/list/).

`GET /products/categories`

**Petición** `GET /products/categories`

**cURL**

```bash
curl https://api.emailit.com/v2/products/categories \
  -H "Authorization: Bearer your_api_key"
```

**200**

```json
{
  "data": [
    {
      "name": "Accessories",
      "products": 18
    },
    {
      "name": "Running",
      "products": 12
    },
    {
      "name": "Shoes",
      "products": 27
    }
  ]
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/products/categories/

## Eliminar un producto — DELETE /products/{id}

> Quita un producto de tu catálogo. Alfa: solo para el equipo de Emailit.

# Eliminar un producto

Quita un producto de tu catálogo. Los pedidos que lo contienen conservan sus artículos, que guardan su propio título, su precio y el ID del producto. Para ocultar un producto sin eliminarlo, cambia su `status` a `archived`. Requiere una clave de API con el permiso `full`.

> **Comercio electrónico está en alfa:** Comercio electrónico solo está abierto al equipo de Emailit mientras lo probamos. Las demás peticiones devuelven `403` con `error: "commerce_alpha"`. Las claves de API solo funcionan en los espacios de trabajo que pertenecen al equipo de Emailit. Consulta [Quién puede usar Comercio electrónico](/es/docs/commerce/#who-can-use-commerce).

Si el [script de seguimiento](/es/docs/commerce/connect-your-shop/#the-tracking-script) registra una vista de un producto eliminado con su título, el producto se vuelve a añadir al catálogo a partir de los datos de la página.

`DELETE /products/{id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID del producto (`prd_...`) o el ID del producto en tu tienda.

**Petición** `DELETE /products/{id}`

**cURL**

```bash
curl -X DELETE https://api.emailit.com/v2/products/prd_3r6HHUGUSl8yjYDscEA6aYA8wrA \
  -H "Authorization: Bearer your_api_key"
```

**200**

```json
{
  "object": "product",
  "id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
  "deleted": true
}
```

**404**

```json
{
  "error": "Product not found",
  "message": "Product not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/products/delete/
