Skip to main content

Manage Products

This guide covers all operations to query, create, update, and delete products and their sub-entities.
For all available fields, types, and validations for each endpoint, see the API Reference.

Important Rules

Before you begin, keep these rules in mind — they apply to all product management:
Mandatory creation order: Product → Options → Variants → Media / Categories. You cannot create variants without options first.
  • Product status: Currently the only supported value is "published". The status is returned as-is in responses.
  • option_values is immutable: Once a variant is created, you cannot change its option_values via PATCH. If you need to fix them, delete the variant and create it again.
  • Supported currencies: MXN, PEN, COP, CLP, ARS, BRL, VES, BOB, USD, PYG, UYU, CRC, EUR.
  • Currency must match the catalog’s currency: All variants of a product must use the same currency configured in the catalog. Using a different currency may cause internal inconsistencies.
  • Responses: PATCH returns 200 with the updated resource. DELETE returns 204 with no body.
  • Every product requires at least one variant: Even simple products (no sizes or colors) need at minimum one option and one variant. Use a generic name like “Presentation” or “Unit”.
  • No batch endpoints: Each entity must be created individually.

Query Products

List products

Returns a paginated list of products with all their sub-entities.
The response includes pagination:
limit accepts a maximum of 100. See Pagination for more details.

Get a product

Returns a product with all its options, variants (with media), and categories.
Response example:

Create a Complete Product

1. Create the product

2. Add options

The response includes the IDs of the created values. Save these IDs to use them when creating variants.
Need to add more values to an option? Use POST /v1/products/{product_id}/options/{option_id}/values with the new value name (e.g. {"name": "XL"}).

3. Create variants

Each variant must include option_values with at least one option value ID.

4. Add media to the variant

Media URLs must be public and accessible. The system cannot access private or authentication-protected URLs.
Allowed file types:

5. Assign categories

This endpoint is idempotent: if a tag is already assigned, it is skipped and the response is 200. Only returns 201 when new tags are assigned.

Update Entities

Delete Entities

This unlinks the category from the product, but does not delete the global category.
Deleting a variant also deletes all its associated media.
You cannot delete an option value if it is associated with an active variant.
Deleting an option also deletes all its values. Variants associated with those values may end up in an inconsistent state.
Deleting a product deletes all its variants, options, option values, and media. This action cannot be undone.

Simple Product (no variations)

Not all products have sizes or colors. Even so, every product requires at least one option and one variant. Use a generic name for the option.
The option name is free-form: "Presentación", "Tipo", "Unidad", etc.

Common Errors

Validation errors (422) return a body with details about the failing field:
You are creating a variant without option_values or with an empty list. You must create options first with POST /v1/products/{product_id}/options and use the IDs of the returned values.
If you try to create a variant before creating options, you will not have value IDs available for the option_values field. Always create options first.
The POST /v1/products/{product_id}/categories endpoint requires tag_ids (a list of numeric IDs), not category names. First create the category with POST /v1/categories and use the returned id.
The catalog_id field is required when creating a product. Get your catalog with GET /v1/catalogs.
The option_values IDs must correspond to values from the same product. Using IDs from another product or nonexistent IDs will result in an error.
PATCH /v1/products/{product_id}/variants/{variant_id} does not accept option_values. Option values for a variant are assigned only at creation time. If you need to fix them, delete the variant and create it again with the correct values.