Products
Create, update, query, link, attach images and delete products — with deterministic pagination, explicit store_id selection, configurable limit and opt-in pagination metadata.
Overview
The /api2/products endpoint is an integration/administrative route. It is not limited to active storefront products — it exposes the catalog for syncing with ERPs, PIMs, marketplaces and internal routines. The route supports both paginated listing and single record lookup by id or sku.
limit is set.limit is missing or invalid.total, last_page, has_next under include_pagination=1.Create a configurable product.
{
"attribute_set_id": 4,
"type_id": "configurable",
"visibility": 4,
"store_id": 1,
"sku": "novo_configuravel",
"name": "novo configuravel",
"description": "Configurable product description",
"short_description": "Short description",
"price": 99.90,
"status": 1,
"tax_class_id": 2,
"categories": [54, 59, 128],
"website_id": [1],
"additional_attributes": {
"single_data": [
{"key": "color", "value": "AZUL"},
{"key": "ncm", "value": "5543"}
]
},
"configurable_attributes": [335]
}
Create a simple product.
{
"type_id": "simple",
"attribute_set_id": 4,
"sku": "produto_teste",
"store_id": 1,
"name": "Test product",
"price": "2000",
"special_price": "150",
"weight": "0.5",
"status": 1,
"visibility": 4,
"categories": [54, 59, 128],
"website_id": [1],
"stock_data": {"qty": "99", "is_in_stock": 1}
}
Update a product.
{
"type": "sku",
"id": "novo_produto",
"name": "New product name"
}
invalid_fields, invalid_attributes and invalid_attribute_values.Fetch a product (single) or list with deterministic pagination.
?page=1&type=sku&id=novo_produto
Link simple products to a configurable.
{
"type": "sku",
"configurable_id": "novo_produto",
"simples": "novo_configuravel"
}
Delete a product.
{
"type": "sku",
"id": "novo_produto"
}
Single product lookup Updated
GET /api2/products still serves the listing when used without a single-record identifier. To fetch one product, send id and type. In this usage the response now includes human-readable references (attribute set, categories, websites, status and visibility), plus a pricing summary and an inventory summary.
GET /api2/products?id=3291&type=sku
GET /api2/products?id=2074&type=id
GET /api2/products?id=3291&type=sku&store_id=1
Parameters
type. Required only for the single lookup.id is interpreted: id or sku. Required only for the single lookup.Response example — simple product
{
"success": true,
"product": {
"product_id": "2074",
"sku": "3291",
"name": "União Ristretto Coffee Capsules 10 units",
"set": "4",
"product_set": {
"id": "4",
"name": "Default"
},
"type": "simple",
"categories": ["122", "124"],
"product_categories": [
{"id": "122", "name": "Compatible Capsules"},
{"id": "124", "name": "Coffee"}
],
"websites": ["1"],
"product_websites": [
{"id": "1", "code": "cafe", "name": "Main Website"}
],
"status": "1",
"product_status": {
"value": "1",
"code": "enabled",
"label": "Enabled"
},
"visibility": "4",
"product_visibility": {
"value": "4",
"code": "catalog_search",
"label": "Catalog, Search"
},
"created_at": "2025-12-01T12:02:21-03:00",
"updated_at": "2025-12-01 19:57:58",
"pricing": {
"price": "28.9000",
"special_price": "25.9000",
"final_price": "25.9000",
"currency": "BRL"
},
"inventory": {
"inventory_manage_stock": true,
"inventory_qty": "38.0000",
"inventory_stock_availability": "in_stock",
"inventory_stock_availability_label": "In Stock",
"inventory_is_salable": true
}
}
}
Backward compatibility
Historical fields remain present with the same semantics: set, categories, websites, status and visibility. The objects product_set, product_categories, product_websites, product_status, product_visibility, pricing and inventory are additive.
- Existing integrations can keep using only the historical fields, with no changes at all.
- New integrations should prefer the enriched objects whenever they need a name, code or label without a manual admin lookup.
Enriched references
id and name.id and name in the requested store context.id, code and name.value, code and label. Stable codes: enabled and disabled.value, code and label. Stable codes: not_visible_individually, catalog, search and catalog_search.label and name fields are meant for display and may follow the language and configuration of the Yep Platform. For integration logic, prefer id, value and code.Pricing summary
The pricing block gives a quick view of the product price in the requested context.
{
"price": "28.9000",
"special_price": "25.9000",
"final_price": "25.9000",
"currency": "BRL"
}
Inventory summary
The inventory block gives a quick view of availability.
{
"inventory_manage_stock": true,
"inventory_qty": "38.0000",
"inventory_stock_availability": "in_stock",
"inventory_stock_availability_label": "In Stock",
"inventory_is_salable": true
}
When to use the dedicated endpoints
The summaries above cover most syncs. For the full pricing detail (group prices, tier prices, tax class, MSRP) use GET /api2/price. For the full stock configuration (backorders, increments, config inheritance) use GET /api2/stock.
HTTP responses
| Scenario | Status |
|---|---|
| Success | 200 |
| Invalid parameters | 400 |
| Missing authentication or invalid token | 401 |
| Not allowed | 403 |
| Product not found | 404 |
| Internal failure | 500 |
200. The 201 statuses used when creating resources remain unchanged.What's new in GET /api2/products
Three main improvements have been rolled out to the listing endpoint, making it more predictable in multi-store environments and more efficient for batch syncs.
5) Optional store_id support New
You can now pass store_id to make the result explicit and deterministic in multi-store scenarios. Without it, store selection follows the environment default; with it, your integration owns the decision.
Example
GET /api2/products?page=1&store_id=1
6) Optional pagination metadata New
Opt-in pagination fields have been added to the response body. They are only returned when include_pagination=1 is sent, avoiding overhead for syncs that don't need this metadata.
1 enables it). When active, includes total, last_page and has_next in the response.include_pagination=1).limit.Example
GET /api2/products?page=1&include_pagination=1
7) Optional limit support New
The endpoint now accepts limit to set the number of products per page. Invalid values (non-numeric, arrays, negative, zero or above the cap) are normalized to the default, ensuring no request breaks due to unexpected input.
| Rule | Value | Behavior |
|---|---|---|
| Default | 20 | Applied when limit is omitted. |
| Maximum | 200 | Hard ceiling to protect the route under heavy load. |
| Invalid | — | Invalid values are normalized to 20. |
Examples
GET /api2/products?page=1&limit=50
GET /api2/products?page=1&limit=200
Supported usage patterns
Quick reference of the tested and certified combinations for GET /api2/products.
GET /api2/products
GET /api2/products?page=2
GET /api2/products?page=1&limit=100
GET /api2/products?id=24404
GET /api2/products?id=ABC-123&type=sku
GET /api2/products?id=2074&type=id
GET /api2/products?page=1&store_id=1
GET /api2/products?page=1&limit=100&include_pagination=1
Integration recommendations
Consolidated best practices after the endpoint evolution. Following them reduces rework, prevents infinite pagination and guarantees determinism in multi-store setups.
Recommended
- Always send
pageexplicitly in pagination routines. - Use
store_idwhenever the integration needs deterministic results in a multi-store environment. - Prefer
limit=50orlimit=100for regular syncs. - Use
limit=200only when you actually need to reduce the number of calls. - Use
include_pagination=1to control pagination progress safely (loop based onhas_next).
Avoid
- Sending parameters as arrays in scalar fields — for example
id[]orlimit[]. - Assuming the endpoint returns only active storefront products. This is an integration/administrative route.
- Relying on implicit ordering across pages in multi-store scenarios without
store_id.
Sync tip
For periodic syncs, combine store_id + limit=100 + include_pagination=1. You get determinism, balanced throughput and a reliable stop condition (has_next=false).
Product images
To query, reconcile, upload, update or delete product images, see Catalog › Images.
GET /api2/products/imagem — images of a SKU or ID, with roles and disabled.GET /api2/products/imagens — every catalog image, cursor-paginated.POST, PUT and DELETE /api2/products/imagem — base64 upload, metadata and deletion. DELETE /api2/products/imagens — full or bulk deletion.