> ## Documentation Index
> Fetch the complete documentation index at: https://docs.leavo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Catálogo de Produtos

> Produtos reutilizáveis, compartilhados por todas as pipelines da conta

O catálogo de produtos é **global por conta** — é compartilhado por todas as pipelines, nunca
escopado a uma delas.

<Info>
  Um negócio também aceita linhas **avulsas** (`custom: true`), que existem só dentro dele e
  nunca entram no catálogo global. Veja
  [Criar negócio](/pt-BR/api-reference/pipeline/deals#criar-negócio).
</Info>

## O objeto Produto

<ResponseField name="id" type="string">
  UUID do produto
</ResponseField>

<ResponseField name="name" type="string">
  Nome do produto
</ResponseField>

<ResponseField name="price" type="number">
  Preço unitário padrão
</ResponseField>

***

## Listar produtos

<Card>
  <strong>GET</strong> `/backend/pipeline/products`
</Card>

Requer `pipeline.view`.

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "https://api.leavo.ai/backend/pipeline/products" \
    -H "Authorization: Bearer sua_chave_aqui"
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  [
    {
      "id": "ff0e8400-e29b-41d4-a716-446655440000",
      "name": "Plano Premium",
      "price": 1500.00
    }
  ]
  ```
</ResponseExample>

***

## Criar produto

<Card>
  <strong>POST</strong> `/backend/pipeline/products`
</Card>

Requer `pipeline.products.manage`.

### Request Body

<ParamField body="name" type="string" required>
  Nome do produto
</ParamField>

<ParamField body="price" type="number">
  Preço unitário. Padrão: `0`.
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "https://api.leavo.ai/backend/pipeline/products" \
    -H "Authorization: Bearer sua_chave_aqui" \
    -H "Content-Type: application/json" \
    -d '{ "name": "Plano Premium", "price": 1500.00 }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.leavo.ai/backend/pipeline/products', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer sua_chave_aqui',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ name: 'Plano Premium', price: 1500.00 })
  });
  ```
</RequestExample>

Retorna **201 Created** com o produto.

***

## Atualizar produto

<Card>
  <strong>PUT</strong> `/backend/pipeline/products/{id}`
</Card>

Requer `pipeline.products.manage`.

<ParamField body="name" type="string" required>
  Nome do produto
</ParamField>

<ParamField body="price" type="number">
  Preço unitário
</ParamField>

<Note>
  Alterar o preço no catálogo **não** altera negócios existentes. Nome e preço são copiados para
  a linha no momento em que o produto é adicionado ao negócio, preservando o valor histórico da
  negociação.
</Note>

***

## Excluir produto

<Card>
  <strong>DELETE</strong> `/backend/pipeline/products/{id}`
</Card>

Requer `pipeline.products.manage`.

<Warning>
  Excluir um produto **não quebra os negócios que já o usam**. As linhas existentes viram linhas
  avulsas (`custom: true`, `product_id: null`), preservando nome e preço — os negócios continuam
  editáveis e o total não muda.
</Warning>

<ResponseExample>
  ```json 200 OK theme={null}
  { "success": true }
  ```
</ResponseExample>
