Logo da Plataforma Yep
API REST · Plataforma Yep Documentação técnica para integrações homologadas

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.

REST JSON Bearer Token Leitura e escrita Novo em 2026

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_image e thumbnail;
  • 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.
Os GETs são somente leitura e não alteram produto, galeria, estoque, índices ou data de atualização do produto.

Mapa de métodos

MétodoRotaFinalidade
GET/api2/products/imagemConsultar imagens de um produto
GET/api2/products/imagensInventário global paginado
POST/api2/products/imagemCriar imagem
PUT/api2/products/imagemAtualizar imagem
DELETE/api2/products/imagemExcluir uma imagem
DELETE/api2/products/imagensExcluir todas ou excluir seletivamente em lote
PATCH /api2/products/imagem responde 405. A atualização usa PUT.
200
Limit máximoPor chamada, via limit.
100
Limit padrãoQuando limit é omitido.
cursor
Paginaçãohas_next + next_cursor. Sem page ou offset.
0
Store padrãostore_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çãoPermissãoNo painel administrativo
GET /api2/products/imagem
GET /api2/products/imagens
products/readProdutos › Visualizar produtos
POST, PUT e DELETE /api2/products/imagem
DELETE /api2/products/imagens
products/imagesProdutos › Gerenciar imagens de produtos
Um cliente com apenas 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.

GET/api2/products/imagemNovo

Consultar as imagens vinculadas a um produto específico.

Somente leituraSem filaSem reindexproducts/read
GET /api2/products/imagem?type=sku&product_id=27.9353&store_id=1&limit=100
Authorization: Bearer {access_token}
O exemplo utiliza 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

type Obrigatório
Define como o product_id é interpretado: sku ou id, seguindo a mesma convenção dos demais endpoints de imagem. O exemplo homologado utiliza sku.
product_id Obrigatório
Identificador do produto conforme o type.
store_id Opcional
Store usada como contexto dos metadados e papéis da imagem. Padrão 0. Recomenda-se informar explicitamente a store frontend da integração.
limit Opcional
Quantidade máxima de imagens por chamada. Padrão 100; aceita de 1 a 200.
cursor Opcional
Cursor de continuação quando houver mais imagens para o mesmo produto. Usar exatamente o 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

CampoTipoDescrição
image_idstringIdentificador estável do registro da imagem no catálogo. É o mesmo valor usado por PUT e DELETE.
filestringCaminho relativo do arquivo dentro da mídia do catálogo.
labelstring / nullRótulo da imagem no contexto da store consultada.
positionint / nullPosição da imagem na galeria.
typesarrayPapéis atribuídos à imagem no contexto consultado.
disabledbooleanIndica se a imagem está desabilitada para a galeria naquele contexto.
urlstringURL pública construída para o arquivo da imagem.
No inventário global cada registro inclui também product_id e sku.

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"
}
Não presuma que apenas imagens ativas são retornadas. Se a integração exibe somente imagens ativas, filtre por 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 types també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çãoResposta
Produto existente sem imagens200 + images: []
Produto inexistente404

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.

GET/api2/products/imagensNovo

Percorrer todas as imagens do catálogo, uma página por chamada.

Somente leituraCursorproducts/read
GET /api2/products/imagens?store_id=1&limit=100
Authorization: Bearer {access_token}

Parâmetros

store_id Opcional
Store de contexto. Padrão 0. Recomenda-se informar explicitamente.
limit Opcional
Inteiro entre 1 e 200. Padrão 100.
cursor Opcional
Cursor retornado pela página anterior em 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.
Para descobrir produtos sem imagem, cruze o inventário com a listagem do GET /api2/products. O inventário sozinho não contém todos os produtos.

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.

Primeira chamada GET /api2/products/imagens?store_id=1&limit=100
Retorno { "has_next": true, "next_cursor": "163608" }
Próxima chamada GET /api2/products/imagens?store_id=1&limit=100&cursor=163608

Fluxo recomendado

  1. iniciar sem cursor;
  2. processar images;
  3. se has_next=true, chamar novamente com cursor igual a next_cursor;
  4. repetir;
  5. encerrar quando has_next=false e next_cursor=null.

Evitar

  • Incrementar o cursor manualmente.
  • Reutilizar um cursor arbitrário como se fosse número de página.
  • Enviar page ou offset.

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

Carga inicialGET /api2/products/imagens?store_id={STORE_ID}&limit=100 e percorrer todos os next_cursor até o final.
Reconciliação periódicaIniciar novamente sem cursor e repetir a varredura completa do inventário.
Consulta pontualGET /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çãoStatus
Consulta bem-sucedida200
Produto existente sem imagens200
Parâmetro inválido400
Sem autenticação ou token inválido401
Sem permissão403
Produto inexistente (endpoint singular)404
Falha interna500

Entradas que retornam 400

  • limit=0, limit=201 ou limit=abc
  • page=2 ou offset=10
  • cursor inválido
  • store_id invá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.

POST/api2/products/imagem

Upload de imagem em base64.

JSONproducts/images
{
  "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"]
}
Obrigatórios: 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.
PUT/api2/products/imagem

Atualizar metadados da imagem.

JSONproducts/images
{
  "type": "sku",
  "product_id": "produtoteste",
  "image_id": "70449",
  "position": 999,
  "label": "Imagem atualizada",
  "types": ["image"]
}
Obrigatórios: product_id e image_id. Opcionais: label, position, types e exclude (1 desabilita a imagem na galeria; padrão 0). Sucesso responde 200.
DELETE/api2/products/imagem

Excluir imagem do produto.

JSONproducts/images
{
  "type": "sku",
  "product_id": "produtoteste",
  "image_id": "70449"
}
Obrigatórios: 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.

O 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.

DELETE/api2/products/imagensNovo

Limpar a galeria inteira de um produto (modo delete_all).

JSONGlobalproducts/images
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

type Obrigatório
Define como o product_id é interpretado: sku ou id.
product_id Obrigatório
Identificador do produto conforme o type.
delete_all Obrigatório
Deve ser o boolean JSON true, estritamente. Os valores "true", 1, false, null ou a ausência do campo são rejeitados.
  • store_id não é aceito: a limpeza é global para a galeria do produto.
  • delete_all e items sã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çãoResposta
Galeria removida200 + deleted_count com a quantidade removida
Produto existente sem imagens200 + deleted_count: 0
Produto inexistente404
A operação remove as associações da galeria do produto. Ela não deve ser entendida como limpeza física do diretório /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.

DELETE/api2/products/imagensNovo

Excluir uma lista de image_ids por produto (modo items).

JSONLoteGlobalproducts/images
{
  "items": [
    {
      "type": "sku",
      "product_id": "PRODUTO-001",
      "image_ids": ["10001", "10002"]
    },
    {
      "type": "id",
      "product_id": 12346,
      "image_ids": ["10003"]
    }
  ]
}
50
Produtos por requisiçãoMáximo de entradas em items.
500
image_ids por requisiçãoMáximo de IDs únicos somando todos os itens.

Regras do payload

  • items deve ser um array não vazio.
  • Cada item exige type, product_id e image_ids.
  • type aceita apenas sku ou id.
  • image_ids deve ser um array não vazio.
  • Cada image_id existente 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_id não pode ser repetido no lote.
  • store_id não é aceito: a exclusão é global.
  • items e delete_all nã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

CampoDescrição
products_processedQuantidade de produtos do lote.
requested_countQuantidade de image_ids solicitados, no total e por produto.
deleted_countQuantidade de imagens efetivamente removidas nesta chamada.
already_absent_countQuantidade de image_ids que já não existiam. Não é erro.
resultsDetalhamento 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 loteStatusEfeito
image_id pertence a outro produto400Nenhuma exclusão
Produto ou image_id repetido400Nenhuma exclusão
Payload inválido400Nenhuma exclusão
Qualquer produto inexistente404Nenhuma 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:

  1. consultar as imagens ou o inventário;
  2. agrupar as exclusões por produto;
  3. montar lotes de até 50 produtos e 500 image_ids;
  4. enviar um lote;
  5. aguardar a resposta;
  6. só então enviar o próximo.
Evite paralelizar vários lotes pesados sem necessidade.

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çãoStatus
Exclusão concluída200
Produto já sem imagens (delete_all)200
IDs já ausentes no lote200
Payload inválido400
Ownership incorreto400
Produto ou image_id repetido400
Sem autenticação ou token inválido401
Sem a permissão products/images403
Produto inexistente404
Método incompatível, como PATCH /api2/products/imagem405
Falha interna500