Gerenciar Produtos
CRUD completo de produtos, variantes, opções, media e categorias
Este guia cobre todas as operações para consultar, criar, atualizar e excluir produtos e suas sub-entidades.
Para ver todos os campos disponíveis, tipos e validações de cada endpoint, consulte o API Reference.
Regras Importantes
Antes de começar, tenha em mente estas regras que se aplicam a toda a gestão de produtos:
Ordem de criação obrigatória: Produto → Opções → Variantes → Media / Categorias. Você não pode criar variantes sem opções primeiro.
- Status do produto: Atualmente o único valor suportado é
"published". O status é retornado igual nas respostas. option_valuesé imutável: Uma vez criada a variante, você não pode alterar seusoption_valuesvia PATCH. Se precisar corrigi-los, exclua a variante e crie-a novamente.- Moedas suportadas:
MXN,PEN,COP,CLP,ARS,BRL,VES,BOB,USD,PYG,UYU,CRC,EUR. - A moeda deve coincidir com a do catálogo: Todas as variantes de um produto devem usar a mesma moeda configurada no catálogo. Usar uma moeda diferente pode causar inconsistências internas.
- Respostas:
PATCHretorna200com o recurso atualizado.DELETEretorna204sem body. - Todo produto requer pelo menos uma variante: Mesmo produtos simples (sem tamanhos ou cores) precisam de no mínimo uma opção e uma variante. Use um nome genérico como "Apresentação" ou "Unidade".
- Não existem endpoints batch: Cada entidade deve ser criada individualmente.
Consultar Produtos
Listar produtos
Retorna uma lista paginada de produtos com todas as suas sub-entidades.
curl -X GET "https://api.ya.onl/v1/products?page=1&limit=25" \
-H "X-API-Key: yv_live_v1_sua_api_key"A resposta inclui paginação:
{
"data": [ /* array de produtos */ ],
"pagination": {
"page": 1,
"limit": 25,
"total_pages": 4,
"total_items": 100,
"has_more": true
}
}limit aceita um máximo de 100. Consulte Paginação para mais detalhes.
Obter um produto
Retorna um produto com todas as suas opções, variantes (com media) e categorias.
curl -X GET "https://api.ya.onl/v1/products/9876" \
-H "X-API-Key: yv_live_v1_sua_api_key"Exemplo de resposta:
{
"id": 9876,
"created_at": "2026-01-15T10:00:00Z",
"name": "Polo Negro",
"description": "Polo de algodón pima de alta calidad",
"characteristics": "Material: 100% algodón pima. Peso: 180g/m².",
"status": "published",
"categories": [
{ "id": 1, "name": "Ropa" }
],
"options": [
{
"id": 10,
"name": "Talla",
"values": [
{ "id": 100, "name": "S" },
{ "id": 101, "name": "M" },
{ "id": 102, "name": "L" }
]
}
],
"variants": [
{
"id": 500,
"name": "Polo Negro - Talla M",
"base_price": 49.90,
"currency": "PEN",
"status": "available",
"media": [
{
"id": 1000,
"title": "Front view",
"url": "https://cdn.example.com/polo-negro-m-front.jpg"
}
]
}
]
}Criar um Produto Completo
1. Criar o produto
curl -X POST "https://api.ya.onl/v1/products" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{
"catalog_id": 1,
"name": "Polo Negro",
"description": "Polo de algodón pima de alta calidad",
"characteristics": "Material: 100% algodón pima. Peso: 180g/m².",
"status": "published"
}'2. Adicionar opções
A resposta inclui os IDs dos valores criados. Guarde esses IDs para usá-los ao criar variantes.
curl -X POST "https://api.ya.onl/v1/products/9876/options" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Talla",
"values": ["S", "M", "L"]
}'Precisa adicionar mais valores a uma opção? Use POST /v1/products/{product_id}/options/{option_id}/values com o nome do novo valor (ex. {"name": "XL"}).
3. Criar variantes
Cada variante deve incluir option_values com pelo menos um ID de valor de opção.
curl -X POST "https://api.ya.onl/v1/products/9876/variants" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Polo Negro - Talla M",
"base_price": 49.90,
"currency": "PEN",
"status": "available",
"option_values": [101]
}'4. Adicionar media à variante
curl -X POST "https://api.ya.onl/v1/products/9876/variants/500/media" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{
"title": "Front view",
"url": "https://cdn.example.com/polo-negro-m-front.jpg"
}'As URLs de media devem ser públicas e acessíveis. O sistema não pode acessar URLs privadas ou protegidas por autenticação.
Tipos de arquivo permitidos:
| Tipo | Extensão | Tamanho máximo |
|---|---|---|
| Imagem | jpeg |
5 MB |
| Imagem | png |
5 MB |
| Vídeo | 3gp |
16 MB |
| Vídeo | mp4 |
16 MB |
| Documento | pdf |
100 MB |
5. Atribuir categorias
Este endpoint é idempotente: se um tag já está atribuído, ele é ignorado e a resposta é 200. Só retorna 201 quando novos tags são atribuídos.
curl -X POST "https://api.ya.onl/v1/products/9876/categories" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"tag_ids": [1, 2]}'Atualizar Entidades
Atualizar produto
curl -X PATCH "https://api.ya.onl/v1/products/9876" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"name": "Polo Negro Premium"}'Atualizar opção
curl -X PATCH "https://api.ya.onl/v1/products/9876/options/10" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"name": "Talla (cm)"}'Atualizar valor de opção
curl -X PATCH "https://api.ya.onl/v1/products/9876/options/10/values/100" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"name": "Small"}'Atualizar variante
curl -X PATCH "https://api.ya.onl/v1/products/9876/variants/500" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"base_price": 59.90, "status": "not_available"}'Atualizar media
curl -X PATCH "https://api.ya.onl/v1/products/9876/variants/500/media/1000" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"title": "Vista frontal atualizada"}'Excluir Entidades
Remover categoria de um produto
Isso desvincula a categoria do produto, mas não exclui a categoria global.
curl -X DELETE "https://api.ya.onl/v1/products/9876/categories/1" \
-H "X-API-Key: yv_live_v1_sua_api_key"Excluir media
curl -X DELETE "https://api.ya.onl/v1/products/9876/variants/500/media/1000" \
-H "X-API-Key: yv_live_v1_sua_api_key"Excluir variante
Excluir uma variante também exclui toda a sua media associada.
curl -X DELETE "https://api.ya.onl/v1/products/9876/variants/500" \
-H "X-API-Key: yv_live_v1_sua_api_key"Excluir valor de opção
Você não pode excluir um valor de opção se ele estiver associado a uma variante ativa.
curl -X DELETE "https://api.ya.onl/v1/products/9876/options/10/values/100" \
-H "X-API-Key: yv_live_v1_sua_api_key"Excluir opção
Excluir uma opção também exclui todos os seus valores. As variantes associadas a esses valores podem ficar em estado inconsistente.
curl -X DELETE "https://api.ya.onl/v1/products/9876/options/10" \
-H "X-API-Key: yv_live_v1_sua_api_key"Excluir produto completo
Excluir um produto exclui todas as suas variantes, opções, valores de opção e media. Essa ação não pode ser desfeita.
curl -X DELETE "https://api.ya.onl/v1/products/9876" \
-H "X-API-Key: yv_live_v1_sua_api_key"Produto Simples (sem variações)
Nem todos os produtos têm tamanhos ou cores. Mesmo assim, todo produto requer pelo menos uma opção e uma variante. Use um nome genérico para a opção.
# 1. Criar produto
curl -X POST "https://api.ya.onl/v1/products" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"catalog_id": 1, "name": "Dona Glaseada", "description": "Dona artesanal con glaseado de azúcar", "status": "published"}'
# 2. Criar opção genérica
curl -X POST "https://api.ya.onl/v1/products/9877/options" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"name": "Presentación", "values": ["Estándar"]}'
# 3. Criar variante única
curl -X POST "https://api.ya.onl/v1/products/9877/variants" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"name": "Dona Glaseada", "base_price": 5.00, "currency": "PEN", "option_values": [200]}'
# 4. Adicionar imagem
curl -X POST "https://api.ya.onl/v1/products/9877/variants/600/media" \
-H "X-API-Key: yv_live_v1_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"title": "Dona Glaseada", "url": "https://cdn.example.com/dona-glaseada.jpg"}'O nome da opção é livre: "Apresentação", "Tipo", "Unidade", etc.
Erros Comuns
Erros de validação (422) retornam um body com detalhes do campo que falhou:
{
"detail": [
{
"loc": ["body", "option_values"],
"msg": "List should have at least 1 item",
"type": "too_short"
}
]
}Você está criando uma variante sem option_values ou com uma lista vazia. Você deve criar opções primeiro com POST /v1/products/{product_id}/options e usar os IDs dos valores retornados.
Criar variantes antes de opções
Se tentar criar uma variante antes de ter criado opções, não terá IDs de valores disponíveis para o campo option_values. Sempre crie opções primeiro.
Usar nome em vez de tag_id para categorias
O endpoint POST /v1/products/{product_id}/categories requer tag_ids (lista de IDs numéricos), não nomes de categoria. Primeiro crie a categoria com POST /v1/categories e use o id retornado.
Esquecer catalog_id ao criar produto
O campo catalog_id é obrigatório ao criar um produto. Obtenha seu catálogo com GET /v1/catalogs.
IDs de option_value inválidos
Os IDs de option_values devem corresponder a valores do mesmo produto. Usar IDs de outro produto ou IDs inexistentes resultará em erro.
Tentar alterar option_values de uma variante existente
PATCH /v1/products/{product_id}/variants/{variant_id} não aceita option_values. Os valores de opção de uma variante são atribuídos apenas na criação. Se precisar corrigi-los, exclua a variante e crie-a novamente com os valores corretos.
