# Ver um produto

> Escopo: produtos:ler. Produto de outra conta responde 404, igual a id inexistente.

URL: https://precificador3d.com.br/docs/api/referencia/obter-produto

`GET https://api.precificador3d.com.br/v1/produtos/{id}`

Escopo: `produtos:ler`. Produto de outra conta responde 404, igual a id inexistente.

Escopo: `produtos:ler`.

## Parâmetros

| Nome | Onde | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- | --- |
| `id` | path | string (uuid) | sim |  |
| `If-None-Match` | header | string | não | ETag recebida antes. Se nada mudou, a resposta é `304` e não gasta a cota mensal. (até 100 caracteres) |

## Resposta 200

Produto.

| Campo | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `id` | string (uuid) | sim |  |
| `nome` | string | sim | (até 120 caracteres) |
| `sku` | string \| null | sim | (até 40 caracteres) |
| `status` | string | sim | Valores: `avaliacao`, `catalogo`, `pausado`. |
| `categoria` | object \| null | sim |  |
| `categoria.id` | string (uuid) | sim |  |
| `categoria.nome` | string | sim |  |
| `titulo` | string \| null | não |  |
| `descricao` | string \| null | não |  |
| `ean` | string \| null | não |  |
| `medidas` | object | não |  |
| `medidas.largura_cm` | number \| null | não |  |
| `medidas.altura_cm` | number \| null | não |  |
| `medidas.profundidade_cm` | number \| null | não |  |
| `medidas.peso_g` | number \| null | não |  |
| `medidas.peso_embalado_g` | number \| null | não |  |
| `quantidade_minima` | integer \| null | não |  |
| `multiplo_de` | integer \| null | não |  |
| `preco_venda_centavos` | integer \| null | sim | Preço da loja própria definido pela conta, ou null. (de 0 a 100000000000) |
| `precos` | array de object | sim | Preço em cada canal ativo, calculado no servidor. |
| `precos[].canal_id` | string (uuid) | sim |  |
| `precos[].canal_nome` | string | sim |  |
| `precos[].preco_centavos` | integer | sim | (de 0 a 100000000000) |
| `faixas` | array de object | sim | Preço por unidade conforme a quantidade (vazio quando o produto não tem faixas). |
| `faixas[].quantidade_a_partir_de` | integer | sim |  |
| `faixas[].preco_unitario_centavos` | integer | sim | (de 0 a 100000000000) |
| `variacoes` | array de Variacao | sim |  |
| `variacoes[].id` | string (uuid) | sim |  |
| `variacoes[].nome` | string | sim |  |
| `variacoes[].sku` | string \| null | sim |  |
| `variacoes[].ativa` | boolean | sim |  |
| `variacoes[].valores` | array de object | sim |  |
| `variacoes[].valores[].tipo` | string | sim |  |
| `variacoes[].valores[].valor` | string | sim |  |
| `variacoes[].cor` | CorCliente \| null | sim |  |
| `variacoes[].cor.id` | string (uuid) | sim |  |
| `variacoes[].cor.codigo` | string | sim |  |
| `variacoes[].cor.nome_cliente` | string | sim |  |
| `variacoes[].cor.acabamento` | string | não | Valores: `nenhum`, `brilhante`, `fosco`. |
| `criado_em` | string (date-time) | sim |  |
| `atualizado_em` | string (date-time) | sim |  |
| `custo_centavos` | integer | não | [custos] Custo completo por unidade. (de 0 a 100000000000) |
| `preco_sugerido_centavos` | integer | não | [custos] Preço sugerido pelo método de preço da conta. (de 0 a 100000000000) |
| `margem_bp` | integer | não | [custos] Margem em pontos-base (2500 = 25%). |
| `lucro_hora_centavos` | integer | não | [custos] Lucro por hora de máquina. |

```json
{
  "id": "5a6b7c8d-9e0f-4a1b-2c3d-4e5f6a7b8c9d",
  "nome": "Chaveiro Dragão",
  "sku": "CHAV-DRG",
  "status": "catalogo",
  "categoria": {
    "id": "b1c2d3e4-f5a6-4b7c-8d9e-0f1a2b3c4d5e",
    "nome": "Chaveiros"
  },
  "titulo": "Chaveiro Dragão articulado impresso em 3D",
  "descricao": "Dragão articulado de 12 cm, com argola.",
  "ean": null,
  "medidas": {
    "largura_cm": 12,
    "altura_cm": 3,
    "profundidade_cm": 2,
    "peso_g": 14,
    "peso_embalado_g": 22
  },
  "quantidade_minima": 1,
  "multiplo_de": null,
  "preco_venda_centavos": 1990,
  "precos": [
    {
      "canal_id": "1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
      "canal_nome": "Loja própria",
      "preco_centavos": 1990
    },
    {
      "canal_id": "2d3e4f5a-6b7c-4d8e-9f0a-1b2c3d4e5f6a",
      "canal_nome": "Marketplace Exemplo",
      "preco_centavos": 2490
    }
  ],
  "faixas": [
    {
      "quantidade_a_partir_de": 1,
      "preco_unitario_centavos": 1990
    },
    {
      "quantidade_a_partir_de": 35,
      "preco_unitario_centavos": 1290
    }
  ],
  "variacoes": [
    {
      "id": "6b7c8d9e-0f1a-4b2c-3d4e-5f6a7b8c9d0e",
      "nome": "Azul",
      "sku": "CHAV-DRG-AZ",
      "ativa": true,
      "valores": [
        {
          "tipo": "Cor",
          "valor": "Azul"
        }
      ],
      "cor": {
        "id": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
        "codigo": "#007",
        "nome_cliente": "Azul",
        "acabamento": "fosco"
      }
    }
  ],
  "criado_em": "2026-08-12T10:00:00-03:00",
  "atualizado_em": "2026-10-02T10:00:00-03:00"
}
```

## Outras respostas

- **304**: Nada mudou desde a ETag informada.
- **400** (`dados_invalidos`): Dados, filtro, cursor ou cabeçalho inválido.
- **401** (`nao_autenticado`): Chave ausente, malformada, desconhecida, revogada ou expirada (a resposta é a mesma para todos os casos).
- **403** (`escopo_insuficiente`): Escopo insuficiente, conta bloqueada, módulo desligado ou chave suspensa.
- **404** (`nao_encontrado`): Não existe nesta conta.
- **429** (`limite_excedido`): Limite de uso excedido (rajada, minuto, mês ou requisições simultâneas).
- **500** (`erro_interno`): Erro interno. O detalhe fica no log, ligado ao requisicao_id.
- **503** (`indisponivel`): API desligada, sob pressão (disjuntor aberto) ou no limite global da plataforma.

## Exemplos

**cURL**

```bash
curl "https://api.precificador3d.com.br/v1/produtos/5a6b7c8d-9e0f-4a1b-2c3d-4e5f6a7b8c9d" \
  -H "Authorization: Bearer $PC3D_CHAVE"
```

**JavaScript**

```js
const resposta = await fetch('https://api.precificador3d.com.br/v1/produtos/5a6b7c8d-9e0f-4a1b-2c3d-4e5f6a7b8c9d', {
  headers: {
    Authorization: `Bearer ${process.env.PC3D_CHAVE}`,
  },
});
if (!resposta.ok) {
  const erro = await resposta.json(); // application/problem+json
  throw new Error(`${erro.codigo}: ${erro.detail} (${erro.requisicao_id})`);
}
const dados = await resposta.json();
```

**Python**

```python
import os

import requests

resposta = requests.get(
    "https://api.precificador3d.com.br/v1/produtos/5a6b7c8d-9e0f-4a1b-2c3d-4e5f6a7b8c9d",
    headers={
        "Authorization": f"Bearer {os.environ['PC3D_CHAVE']}",
    },
    timeout=10,
)
resposta.raise_for_status()
dados = resposta.json()
```
