Produtos

Os produtos cadastrados são o que o operador vê na tela do Smart POS para vender direto no app, sem digitar valor. São três cadastros: categoria e marca, que organizam a exibição, e o produto, que é o item vendido.

Ordem de cadastro

Um produto só aponta para uma categoria ou marca já cadastrada. A ordem, portanto, é sempre a mesma:

  1. Categoria — os agrupamentos que aparecem na tela.
  2. Marca — opcional, mas cadastrada antes do produto que a referencia.
  3. Produto — em lote, referenciando as duas anteriores.

Conceitos comuns

Antes dos endpoints, duas regras valem para os três recursos. Paginação, ordenação e códigos de resposta seguem o padrão comum a toda a API — veja a página de Referência.

Identificador

Categoria, marca e produto são endereçados por um identificador — um código definido por você (SKU, código interno). É ele que aparece nas URLs e nos vínculos entre os recursos, não o id numérico que a API devolve.

RegraValor
Tamanho1 a 32 caracteres
Caracteres aceitosletras (A–Z, a–z), números (0–9) e hífen
Unicidadenão pode repetir dentro da mesma empresa

O identificador não é editável

Não existe operação para trocar o identificador de um registro. Para mudá-lo, exclua e cadastre outro — o que também desfaz os vínculos de produtos que apontavam para ele. Escolha o padrão de código antes de carregar a base.

Imagem

O campo imagem é opcional nos três recursos. Quando enviado, é a imagem codificada em base64 com prefixo data URI:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...
LimiteValor
FormatosPNG, JPG, JPEG, GIF, TIFF
Tamanho1 MB
Dimensões512 × 512 pixels

Nas respostas, imagem vem como a URL pública do arquivo — nunca como base64.

Categoria

Agrupa produtos na tela do Smart POS. É o primeiro dos três cadastros.

Endpoints

MétodoEndpointDescrição
POST/produto/categoriaCadastrar categoria
PUT/produto/categoriaEditar categoria
GET/produto/categoriaListar categorias
DELETE/produto/categoria/{identificador}Excluir categoria

Cadastrando

curl --request POST \
  --url 'https://api.pinpdv.com.br/produto/categoria' \
  --header 'Authorization: Bearer {SEU_TOKEN}' \
  --header 'Content-Type: application/json' \
  --data '{
    "identificador": "BEBIDAS",
    "nome": "Bebidas geladas",
    "ordenar": 1,
    "descricao": "Refrigerantes, sucos e água",
    "cor": "#1E88E5"
  }'
CampoTipoObrigatórioRegra
identificadortextosim1–32 caracteres, único
nometextosim4 a 80 caracteres
ordenarnúmeronão0 a 255 — ordem de exibição na tela
descricaotextonãoaté 180 caracteres
cortextonãoaté 12 caracteres (ex.: #1E88E5)
imagemtextonãover Imagem
200 - OK

{
  "id": 42,
  "identificador": "BEBIDAS",
  "nome": "Bebidas geladas",
  "ordenar": 1,
  "descricao": "Refrigerantes, sucos e água",
  "imagem": null,
  "cor": "#1E88E5"
}

Editando

O identificador vai no corpo e serve para localizar o registro.

curl --request PUT \
  --url 'https://api.pinpdv.com.br/produto/categoria' \
  --header 'Authorization: Bearer {SEU_TOKEN}' \
  --header 'Content-Type: application/json' \
  --data '{
    "identificador": "BEBIDAS",
    "nome": "Bebidas",
    "ordenar": 2,
    "descricao": "Bebidas em geral",
    "cor": "#0D47A1",
    "imagem": null,
    "removerImagem": false
  }'

A imagem tem três comportamentos, combinando imagem e removerImagem:

imagemremoverImagemResultado
preenchidafalsesubstitui a imagem
vazia ou nulafalsemantém a imagem atual
vazia ou nulatrueremove a imagem
202 - Accepted

Listando

curl --request GET \
  --url 'https://api.pinpdv.com.br/produto/categoria?paginaNumero=1&qtdRegistro=50&ordenarPor=Nome&ordenarTipo=ASC' \
  --header 'Authorization: Bearer {SEU_TOKEN}'

Valores aceitos em ordenarPor: Id, Identificador, Nome, Descricao, CadastradoEm, AtualizadoEm.

Cada item de data:

{
  "id": 42,
  "identificador": "BEBIDAS",
  "nome": "Bebidas",
  "ordenar": 1,
  "descricao": "Bebidas em geral",
  "imagem": "https://cdn.pinpdv.com.br/produto-categorias/42/abc123.png",
  "cor": "#1E88E5",
  "cadastradoPor": { "id": 12, "nome": "Fulano", "dataHora": "2026-08-01T10:22:00" },
  "atualizadoPor": { "id": 12, "nome": "Fulano", "dataHora": "2026-08-20T14:05:00" }
}

Excluindo

curl --request DELETE \
  --url 'https://api.pinpdv.com.br/produto/categoria/BEBIDAS' \
  --header 'Authorization: Bearer {SEU_TOKEN}'
202 - Accepted

Excluir a categoria não exclui nem bloqueia os produtos vinculados a ela — eles continuam à venda, apenas deixam de exibir a categoria.

Marca

O contrato é idêntico ao de categoria — mesmos campos, mesmas regras, mesmas respostas, mesmo comportamento de imagem. Muda apenas a rota.

Endpoints

MétodoEndpointDescrição
POST/produto/marcaCadastrar marca
PUT/produto/marcaEditar marca
GET/produto/marcaListar marcas
DELETE/produto/marca/{identificador}Excluir marca

Cadastrando

curl --request POST \
  --url 'https://api.pinpdv.com.br/produto/marca' \
  --header 'Authorization: Bearer {SEU_TOKEN}' \
  --header 'Content-Type: application/json' \
  --data '{
    "identificador": "COCACOLA",
    "nome": "Coca-Cola",
    "ordenar": 1,
    "descricao": "Refrigerantes Coca-Cola",
    "cor": "#E53935"
  }'
200 - OK

{
  "id": 8,
  "identificador": "COCACOLA",
  "nome": "Coca-Cola",
  "ordenar": 1,
  "descricao": "Refrigerantes Coca-Cola",
  "imagem": null,
  "cor": "#E53935"
}

Editando

curl --request PUT \
  --url 'https://api.pinpdv.com.br/produto/marca' \
  --header 'Authorization: Bearer {SEU_TOKEN}' \
  --header 'Content-Type: application/json' \
  --data '{
    "identificador": "COCACOLA",
    "nome": "Coca-Cola Brasil",
    "ordenar": 2,
    "descricao": "Bebidas Coca-Cola",
    "cor": "#B71C1C",
    "imagem": null,
    "removerImagem": false
  }'
202 - Accepted

Listando e excluindo

# Listar
curl --request GET \
  --url 'https://api.pinpdv.com.br/produto/marca?paginaNumero=1&qtdRegistro=50&ordenarPor=Nome&ordenarTipo=ASC' \
  --header 'Authorization: Bearer {SEU_TOKEN}'

# Excluir
curl --request DELETE \
  --url 'https://api.pinpdv.com.br/produto/marca/COCACOLA' \
  --header 'Authorization: Bearer {SEU_TOKEN}'

Valores aceitos em ordenarPor: Id, Identificador, Nome, Descricao, CadastradoEm, AtualizadoEm. O formato dos itens é o mesmo da listagem de categorias.

Como na categoria, excluir a marca não afeta os produtos vinculados.

Produto

O item vendido. Cadastrado em lote, editado um a um.

Endpoints

MétodoEndpointDescrição
POST/produtoCadastrar produtos (1 a 100 por chamada)
GET/produtoListar produtos
PUT/produtoEditar produto
PUT/produto/{identificador}/ativarAtivar produto
PUT/produto/{identificador}/desativarDesativar produto
DELETE/produto/{identificador}Excluir produto

Cadastrando

Os produtos vão em data, de 1 até 100 por requisição.

curl --request POST \
  --url 'https://api.pinpdv.com.br/produto' \
  --header 'Authorization: Bearer {SEU_TOKEN}' \
  --header 'Content-Type: application/json' \
  --data '[
    {
      "identificador": "REFRI-350",
      "nome": "Refrigerante lata 350ml",
      "preco": 6.50,
      "unidade": "Unidade",
      "descricao": "Lata 350ml gelada",
      "categoria": "BEBIDAS",
      "marca": "COCACOLA",
      "modelo": "Lata",
      "codigoBarras": "7894900011517"
    }
  ]'
CampoTipoObrigatórioRegra
identificadortextosim1–32 caracteres, único
nometextosim4 a 80 caracteres
precodecimalsimmaior que 0 e até 999999,99
unidadetextonãover Unidades — padrão Unidade
descricaotextonãoaté 180 caracteres
categoriatextonãoidentificador de uma categoria existente
marcatextonãoidentificador de uma marca existente
modelotextonãoaté 60 caracteres
codigoBarrastextonãoaté 40 caracteres
imagemtextonãover Imagem

A validação do lote é tudo ou nada

Um único item inválido reprova a requisição inteira com 422 — nenhum produto do lote é gravado. Também não repita o mesmo identificador dentro da mesma chamada.

Ao carregar listas grandes, prefira lotes menores: fica mais simples identificar qual item reprovou.

A resposta traz um objeto por produto criado:

200 - OK

[
  {
    "id": 981,
    "identificador": "REFRI-350",
    "nome": "Refrigerante lata 350ml",
    "isAtivo": true,
    "preco": 6.50,
    "descricao": "Lata 350ml gelada",
    "categoria": { "key": "BEBIDAS", "value": "Bebidas" },
    "marca": { "key": "COCACOLA", "value": "Coca-Cola" },
    "modelo": "Lata",
    "codigoBarras": "7894900011517"
  }
]

Unidades

Valores aceitos em unidade:

Unidade, Litro, Quilograma.

Editando

Um produto por requisição. O corpo é o produto direto, sem array.

curl --request PUT \
  --url 'https://api.pinpdv.com.br/produto' \
  --header 'Authorization: Bearer {SEU_TOKEN}' \
  --header 'Content-Type: application/json' \
  --data '{
    "identificador": "REFRI-350",
    "nome": "Refrigerante lata 350ml",
    "preco": 7.00,
    "unidade": "Unidade",
    "descricao": "Lata 350ml",
    "categoria": "BEBIDAS",
    "marca": "COCACOLA",
    "modelo": "Lata",
    "codigoBarras": "7894900011517",
    "imagem": null
  }'

É substituição completa, não alteração parcial

Campo omitido é gravado como vazio. Para mudar só o preço, ainda assim envie o produto inteiro — nome, categoria, marca, código de barras e o resto. Leia o produto na listagem, altere o campo e devolva tudo.

Consequência direta: categoria ou marca enviadas vazias desvinculam o produto.

Há uma exceção à regra acima: imagem vazia ou nula mantém a imagem atual — não a apaga.

A resposta é o produto atualizado, no mesmo formato do cadastro.

Listando

curl --request GET \
  --url 'https://api.pinpdv.com.br/produto?paginaNumero=1&qtdRegistro=100&ordenarPor=Nome&ordenarTipo=ASC' \
  --header 'Authorization: Bearer {SEU_TOKEN}'

Valores aceitos em ordenarPor: Id, Identificador, Nome, Descricao, Categoria, Marca, Modelo, CodigoBarras, IsAtivo, Preco, CadastradoEm, AtualizadoEm.

Há ainda um parâmetro exclusivo desta listagem:

ParâmetroEfeito
removerImagemtrue omite as imagens da resposta — útil em sincronizações grandes, onde as URLs não interessam

Cada item de data traz categoria e marca expandidas, não apenas o identificador:

{
  "id": 981,
  "identificador": "REFRI-350",
  "nome": "Refrigerante lata 350ml",
  "descricao": "Lata 350ml",
  "categoria": { "id": 42, "identificador": "BEBIDAS", "nome": "Bebidas", "cor": "#1E88E5" },
  "marca": { "id": 8, "identificador": "COCACOLA", "nome": "Coca-Cola", "cor": "#E53935" },
  "modelo": "Lata",
  "codigoBarras": "7894900011517",
  "unidade": "Unidade",
  "preco": 7.00,
  "isAtivo": true,
  "imagens": [
    { "url": "https://cdn.pinpdv.com.br/produtos/981/abc123.png", "padrao": true }
  ],
  "cadastradoPor": { "id": 12, "nome": "Fulano", "dataHora": "2026-08-01T10:22:00" },
  "atualizadoPor": { "id": 12, "nome": "Fulano", "dataHora": "2026-08-20T14:05:00" }
}

A listagem traz produtos ativos e inativos — use isAtivo para distinguir.

Ativando e desativando

Prefira desativar a excluir: o produto some da tela do Smart POS mas permanece no cadastro, pronto para voltar.

# Desativar
curl --request PUT \
  --url 'https://api.pinpdv.com.br/produto/REFRI-350/desativar' \
  --header 'Authorization: Bearer {SEU_TOKEN}'

# Ativar
curl --request PUT \
  --url 'https://api.pinpdv.com.br/produto/REFRI-350/ativar' \
  --header 'Authorization: Bearer {SEU_TOKEN}'
202 - Accepted

Excluindo

curl --request DELETE \
  --url 'https://api.pinpdv.com.br/produto/REFRI-350' \
  --header 'Authorization: Bearer {SEU_TOKEN}'
202 - Accepted

O produto sai do cadastro, mas permanece nas vendas já registradas — o histórico não é afetado.

Erros mais comuns

MensagemCausa
O Identificador já existe cadastrado.identificador em uso na empresa
O Identificador contém caracteres inválidos.use apenas letras, números e hífen
O Nome deve ter no mínimo 4 caracteresnome curto demais
O Preço deve ser maior que zero (0.00)preço zerado ou negativo
Nenhuma categoria foi encontrada com o identificador fornecidocadastre a categoria antes do produto
Nenhuma marca foi encontrada com o identificador fornecidocadastre a marca antes do produto
O formato da imagem é inválido.falta o prefixo data:image/...;base64, ou o formato não é aceito

Teste antes de escrever código

A coleção do Postman traz as requisições prontas, nas pastas Cadastro de Categorias, Cadastro de Marcas e Cadastro de Produtos — nessa ordem — para você experimentar antes de escrever a primeira linha de código.

© 2026 Multiplus Card. Todos os direitos reservados.