Imagens
Consulta e gerenciamento das imagens vinculadas aos produtos — com leitura individual por produto, inventário global paginado por cursor, metadados da galeria, papéis de imagem e suporte explícito a store_id.
Visão geral
A API de imagens permite:
- consultar todas as imagens de um produto específico;
- percorrer o inventário global de imagens do catálogo;
- identificar imagens habilitadas e desabilitadas;
- identificar os papéis
image,small_imageethumbnail; - trabalhar de forma determinística com
store_id; - realizar carga inicial e reconciliação completa utilizando paginação por cursor;
- continuar utilizando os endpoints já existentes para criação, atualização e exclusão de imagens;
- remover todas as imagens de um produto em uma única chamada;
- remover imagens específicas de vários produtos em uma única chamada.
Mapa de métodos
| Método | Rota | Finalidade |
|---|---|---|
| GET | /api2/products/imagem | Consultar imagens de um produto |
| GET | /api2/products/imagens | Inventário global paginado |
| POST | /api2/products/imagem | Criar imagem |
| PUT | /api2/products/imagem | Atualizar imagem |
| DELETE | /api2/products/imagem | Excluir uma imagem |
| DELETE | /api2/products/imagens | Excluir todas ou excluir seletivamente em lote |
PATCH /api2/products/imagem responde 405. A atualização usa PUT.limit.limit é omitido.has_next + next_cursor. Sem page ou offset.store_id=0 é o escopo administrativo/global.Permissões OAuth2
Leitura e escrita de imagens usam permissões diferentes. Ao configurar o cliente OAuth2 no painel administrativo, conceda apenas o necessário para a integração.
| Operação | Permissão | No painel administrativo |
|---|---|---|
GET /api2/products/imagemGET /api2/products/imagens | products/read | Produtos › Visualizar produtos |
POST, PUT e DELETE /api2/products/imagemDELETE /api2/products/imagens | products/images | Produtos › Gerenciar imagens de produtos |
products/read consegue consultar e reconciliar imagens, mas recebe 403 ao tentar criar, atualizar ou excluir — inclusive nas exclusões em lote.Consultar imagens de um produto Novo
Operação somente leitura: retorna todas as imagens da galeria de um produto, incluindo as desabilitadas, com os papéis e o rótulo no contexto da store consultada.
Consultar as imagens vinculadas a um produto específico.
GET /api2/products/imagem?type=sku&product_id=27.9353&store_id=1&limit=100
Authorization: Bearer {access_token}
store_id=1 por representar uma store frontend comum. Em cada projeto a integração deve informar o ID da store correspondente; store_id=0 representa o escopo administrativo/global.Parâmetros
product_id é interpretado: sku ou id, seguindo a mesma convenção dos demais endpoints de imagem. O exemplo homologado utiliza sku.type.0. Recomenda-se informar explicitamente a store frontend da integração.100; aceita de 1 a 200.next_cursor retornado na chamada anterior.Exemplo de resposta
{
"success": true,
"product_id": 115973,
"sku": "27.9353",
"store_id": 1,
"images": [
{
"image_id": "690992",
"file": "/e/s/escova-robinson-taca-soft.jpg_1.jpg",
"label": "Imagem 1",
"position": 1,
"types": [
"image",
"small_image",
"thumbnail"
],
"disabled": false,
"url": "https://www.exemplo.com.br/media/catalog/product/e/s/escova-robinson-taca-soft.jpg_1.jpg"
}
],
"has_next": false,
"next_cursor": null
}
Campos da imagem
| Campo | Tipo | Descrição |
|---|---|---|
image_id | string | Identificador estável do registro da imagem no catálogo. É o mesmo valor usado por PUT e DELETE. |
file | string | Caminho relativo do arquivo dentro da mídia do catálogo. |
label | string / null | Rótulo da imagem no contexto da store consultada. |
position | int / null | Posição da imagem na galeria. |
types | array | Papéis atribuídos à imagem no contexto consultado. |
disabled | boolean | Indica se a imagem está desabilitada para a galeria naquele contexto. |
url | string | URL pública construída para o arquivo da imagem. |
Papéis da imagem (types)
types informa os papéis que a imagem exerce no produto. Os valores possíveis são image (imagem base), small_image (imagem pequena) e thumbnail (miniatura).
"types": [
"image",
"small_image",
"thumbnail"
]
Uma imagem pode pertencer à galeria sem exercer nenhum desses papéis:
"types": []
types=[] é válido
Um array vazio significa apenas que a imagem está na galeria sem papel atribuído naquele contexto. Não significa ausência da imagem e não deve ser tratado como erro pela integração.
Imagens desabilitadas
As consultas de leitura incluem imagens desabilitadas. Isso é intencional: a integração pode usar disabled para reconciliar corretamente imagens existentes que não devem ser apresentadas como ativas.
{
"image_id": "653867",
"file": "/p/o/ponta-diamantada_58.jpg",
"label": "Imagem 1",
"position": 1,
"types": [],
"disabled": true,
"url": "https://www.exemplo.com.br/media/catalog/product/p/o/ponta-diamantada_58.jpg"
}
disabled=false do lado do consumidor.Store e fallback
store_id=0 representa o escopo administrativo/global. Para integrações com a loja frontend, informe explicitamente o ID da store utilizada pelo projeto — por exemplo store_id=1. Em ambientes multiloja podem existir store_id=1, store_id=2, store_id=3 e assim por diante.
- Os campos de galeria (
label,position,disabled) usam o contexto da store consultada e podem herdar valores do escopo global quando não houver sobrescrita específica. - Os papéis em
typestambém respeitam a configuração do contexto solicitado. store_id=1é apenas um exemplo comum — não é um valor universal da Plataforma Yep.
Produto existente sem imagens
Produto existente sem imagens retorna HTTP 200 com a lista vazia:
{
"success": true,
"product_id": 116022,
"sku": "25.5979",
"store_id": 0,
"images": [],
"has_next": false,
"next_cursor": null
}
| Situação | Resposta |
|---|---|
| Produto existente sem imagens | 200 + images: [] |
| Produto inexistente | 404 |
Inventário global de imagens Novo
Retorna o inventário de imagens do catálogo de forma paginada por cursor. Indicado para carga inicial e reconciliação completa.
Percorrer todas as imagens do catálogo, uma página por chamada.
GET /api2/products/imagens?store_id=1&limit=100
Authorization: Bearer {access_token}
Parâmetros
0. Recomenda-se informar explicitamente.1 e 200. Padrão 100.next_cursor. Omitir na primeira chamada.Não existe page nem offset
Este endpoint pagina exclusivamente por cursor. Requisições contendo page ou offset são tratadas como inválidas e retornam 400.
Exemplo de resposta
{
"success": true,
"store_id": 1,
"images": [
{
"image_id": "160031",
"product_id": 98622,
"sku": "25.0886",
"file": "/b/r/broca-carbide-fg-36.jpg_10.jpg",
"label": "Imagem 1",
"position": 1,
"types": [],
"disabled": false,
"url": "https://www.exemplo.com.br/media/catalog/product/b/r/broca-carbide-fg-36.jpg_10.jpg"
}
],
"has_next": true,
"next_cursor": "160115"
}
Semântica do inventário
O endpoint plural é um inventário de imagens, não de produtos. Consequentemente:
- um produto com várias imagens aparece várias vezes — cada registro representa uma imagem;
- produtos sem nenhuma imagem não aparecem no inventário;
- imagens desabilitadas aparecem com
disabled=true; - status e visibilidade do produto não são usados como filtro da galeria.
Paginação por cursor
Toda listagem que pode ultrapassar uma página devolve has_next e next_cursor. A integração avança repassando o cursor recebido, sem calcular nada.
GET /api2/products/imagens?store_id=1&limit=100
{ "has_next": true, "next_cursor": "163608" }
GET /api2/products/imagens?store_id=1&limit=100&cursor=163608
Fluxo recomendado
- iniciar sem
cursor; - processar
images; - se
has_next=true, chamar novamente comcursorigual anext_cursor; - repetir;
- encerrar quando
has_next=falseenext_cursor=null.
Evitar
- Incrementar o cursor manualmente.
- Reutilizar um cursor arbitrário como se fosse número de página.
- Enviar
pageouoffset.
O cursor não é marcador permanente de alterações
O cursor serve exclusivamente para continuação da paginação da varredura atual. Ele não representa data de atualização, versão do produto, snapshot imutável nem feed incremental de alterações. Não armazene indefinidamente o último cursor para tentar descobrir imagens alteradas dias depois: uma imagem antiga modificada não recebe um image_id novo apenas por ter seus metadados alterados.
Para uma nova reconciliação completa: reiniciar sem cursor → percorrer novamente todas as páginas → finalizar quando has_next=false.
Recomendações para integração
GET /api2/products/imagens?store_id={STORE_ID}&limit=100 e percorrer todos os next_cursor até o final.GET /api2/products/imagem?type=sku&product_id={SKU}&store_id={STORE_ID}&limit=100 para um SKU conhecido.Resumo
Carga inicial / reconciliação: GET /api2/products/imagens com paginação por next_cursor.
Consulta de um produto: GET /api2/products/imagem.
Respostas HTTP das consultas
| Situação | Status |
|---|---|
| Consulta bem-sucedida | 200 |
| Produto existente sem imagens | 200 |
| Parâmetro inválido | 400 |
| Sem autenticação ou token inválido | 401 |
| Sem permissão | 403 |
| Produto inexistente (endpoint singular) | 404 |
| Falha interna | 500 |
Entradas que retornam 400
limit=0,limit=201oulimit=abcpage=2ouoffset=10cursorinválidostore_idinválido
Somente leitura, sem efeitos colaterais
GET /api2/products/imagem e GET /api2/products/imagens não atualizam o produto, não alteram updated_at, não alteram a galeria, não criam fila, não executam reindexação e não alteram estoque ou preço.
A url retornada é construída a partir do cadastro da mídia. A consulta não verifica a existência física do arquivo remoto.
Operações de escrita
Criação, atualização e exclusão individual de imagens continuam disponíveis na rota singular, diferenciadas pelo método HTTP. Exigem a permissão products/images. Os GETs não substituem estas operações. Para remover várias imagens de uma vez, veja exclusão total e exclusão seletiva em lote.
Upload de imagem em base64.
{
"type": "sku",
"product_id": "novo_produto",
"position": 1,
"label": "Imagem",
"file_name": "minha_imagem.png",
"file_mime_type": "image/png",
"file_content": "iVBORw0KGgoAAAANS...",
"types": ["image"]
}
product_id, file_content, file_mime_type, label e position. type aceita sku ou id (padrão id). file_name é opcional — quando omitido, um nome único é gerado. Sucesso responde 201 com o image_id criado.Atualizar metadados da imagem.
{
"type": "sku",
"product_id": "produtoteste",
"image_id": "70449",
"position": 999,
"label": "Imagem atualizada",
"types": ["image"]
}
product_id e image_id. Opcionais: label, position, types e exclude (1 desabilita a imagem na galeria; padrão 0). Sucesso responde 200.Excluir imagem do produto.
{
"type": "sku",
"product_id": "produtoteste",
"image_id": "70449"
}
product_id e image_id. Sucesso responde 200. Continua indicado para remover uma imagem por chamada.A atualização usa PUT, não PATCH
Diferentemente de /api2/products, a rota de imagem aceita PUT para atualização. Uma requisição PATCH /api2/products/imagem responde 405 (método não permitido). Versões anteriores desta documentação exibiam PATCH por engano.
image_id usado em PUT e DELETE é o mesmo retornado pelas consultas desta página e pelo POST de upload.Excluir todas as imagens de um produto Novo
Remove toda a galeria global de um único produto em uma única requisição.
Limpar a galeria inteira de um produto (modo delete_all).
DELETE /api2/products/imagens
Authorization: Bearer {access_token}
Content-Type: application/json
{
"type": "sku",
"product_id": "PRODUTO-001",
"delete_all": true
}
Também aceita identificação por ID:
{
"type": "id",
"product_id": 12345,
"delete_all": true
}
Parâmetros
product_id é interpretado: sku ou id.type.true, estritamente. Os valores "true", 1, false, null ou a ausência do campo são rejeitados.store_idnão é aceito: a limpeza é global para a galeria do produto.delete_alleitemssão modos mutuamente exclusivos na mesma requisição.
Exemplo de resposta
{
"success": true,
"product_id": 12345,
"sku": "PRODUTO-001",
"deleted_count": 3
}
Produto que já está sem imagens responde 200 com deleted_count: 0:
{
"success": true,
"product_id": 12345,
"sku": "PRODUTO-001",
"deleted_count": 0
}
| Situação | Resposta |
|---|---|
| Galeria removida | 200 + deleted_count com a quantidade removida |
| Produto existente sem imagens | 200 + deleted_count: 0 |
| Produto inexistente | 404 |
/media.Não faça retry cego depois de novo upload
Cada chamada com delete_all=true representa a intenção de limpar a galeria atual. Se a integração já iniciou o upload de novas imagens, não reenvie uma chamada antiga de delete_all: ela removeria também as imagens recém-enviadas.
Excluir imagens específicas em lote Novo
Remove imagens específicas de um ou vários produtos em uma única chamada. É possível misturar identificação por SKU e por ID no mesmo lote.
Excluir uma lista de image_ids por produto (modo items).
{
"items": [
{
"type": "sku",
"product_id": "PRODUTO-001",
"image_ids": ["10001", "10002"]
},
{
"type": "id",
"product_id": 12346,
"image_ids": ["10003"]
}
]
}
items.image_ids por requisiçãoMáximo de IDs únicos somando todos os itens.Regras do payload
itemsdeve ser um array não vazio.- Cada item exige
type,product_ideimage_ids. typeaceita apenasskuouid.image_idsdeve ser um array não vazio.- Cada
image_idexistente deve pertencer ao produto informado no mesmo item.
- O mesmo produto não pode aparecer duas vezes, mesmo que uma entrada use SKU e outra use ID.
- O mesmo
image_idnão pode ser repetido no lote. store_idnão é aceito: a exclusão é global.itemsedelete_allnão podem ser enviados juntos.
Exemplo de resposta
{
"success": true,
"products_processed": 2,
"requested_count": 3,
"deleted_count": 2,
"already_absent_count": 1,
"results": [
{
"product_id": 12345,
"sku": "PRODUTO-001",
"requested_count": 2,
"deleted_count": 2,
"already_absent_count": 0
},
{
"product_id": 12346,
"sku": "PRODUTO-002",
"requested_count": 1,
"deleted_count": 0,
"already_absent_count": 1
}
]
}
Campos da resposta
| Campo | Descrição |
|---|---|
products_processed | Quantidade de produtos do lote. |
requested_count | Quantidade de image_ids solicitados, no total e por produto. |
deleted_count | Quantidade de imagens efetivamente removidas nesta chamada. |
already_absent_count | Quantidade de image_ids que já não existiam. Não é erro. |
results | Detalhamento por produto, com product_id e sku resolvidos. |
Idempotente para IDs já removidos
Reenviar o mesmo lote não gera erro: os IDs que já foram removidos entram em already_absent_count e deleted_count fica em 0. Quando a API retorna sucesso, todos os image_ids solicitados estão ausentes dos respectivos produtos ao final da operação.
Garantias da exclusão em lote
Validação antes de excluir
O lote é validado antes da aplicação das exclusões. Erros de produto inexistente, ownership incorreto, duplicidade ou payload inválido não geram exclusão parcial dos demais itens: a requisição inteira é rejeitada e nenhuma imagem é removida.
| Erro no lote | Status | Efeito |
|---|---|---|
image_id pertence a outro produto | 400 | Nenhuma exclusão |
Produto ou image_id repetido | 400 | Nenhuma exclusão |
| Payload inválido | 400 | Nenhuma exclusão |
| Qualquer produto inexistente | 404 | Nenhuma exclusão |
Imagens duplicadas e papéis
Duas associações da galeria podem apontar para o mesmo arquivo. Se apenas um image_id for removido e outra associação do mesmo produto continuar usando o mesmo file, os papéis image, small_image e thumbnail permanecem válidos.
Os papéis são limpos apenas quando a última associação daquele arquivo deixa de existir no produto.
Recomendações operacionais
Para reconciliação de galerias:
- consultar as imagens ou o inventário;
- agrupar as exclusões por produto;
- montar lotes de até 50 produtos e 500
image_ids; - enviar um lote;
- aguardar a resposta;
- só então enviar o próximo.
Leitura por store, exclusão global
As consultas continuam usando o store_id da integração, por exemplo store_id=1. Os DELETEs em lote são globais e não recebem store_id.
Respostas HTTP da escrita
| Situação | Status |
|---|---|
| Exclusão concluída | 200 |
Produto já sem imagens (delete_all) | 200 |
| IDs já ausentes no lote | 200 |
| Payload inválido | 400 |
| Ownership incorreto | 400 |
Produto ou image_id repetido | 400 |
| Sem autenticação ou token inválido | 401 |
Sem a permissão products/images | 403 |
| Produto inexistente | 404 |
Método incompatível, como PATCH /api2/products/imagem | 405 |
| Falha interna | 500 |