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

# Webhook - Envio de Produtos

> Receba notificações quando produtos forem criados ou alterados no sistema.

## Descrição

Este webhook é acionado automaticamente sempre que um produto for cadastrado ou tiver suas informações alteradas no Olist ERP.

## Quando é Acionado

O webhook de envio de produtos é disparado nas seguintes situações:

* Cadastro de novo produto
* Alteração de dados do produto (nome, descrição, preço, etc.)
* Alteração de imagens
* Alteração de categoria
* Ativação/desativação de produto
* Alteração de variações

## Estrutura da Notificação

```json theme={null}
{
  "evento": "envio_produtos",
  "data_hora": "20/05/2024 16:45:30",
  "acao": "incluir",
  "produtos": [
    {
      "id": 123456,
      "sku": "PROD-001",
      "nome": "Produto Exemplo",
      "preco": 99.90,
      "preco_promocional": 79.90,
      "unidade": "UN",
      "peso_bruto": 0.5,
      "peso_liquido": 0.45,
      "altura": 10,
      "largura": 15,
      "comprimento": 20,
      "ncm": "12345678",
      "origem": 0,
      "gtin": "7891234567890",
      "categoria": "Eletrônicos > Smartphones",
      "estoque": 50,
      "situacao": "A",
      "tipo": "P",
      "classe_ipi": "Classe A",
      "codigo_beneficio_fiscal": "PR123456",
      "anexos": [
        {
          "url": "https://cdn.tiny.com.br/images/123456_1.jpg"
        }
      ]
    }
  ]
}
```

## Campos da Notificação

| Campo                                 | Tipo    | Descrição                                   |
| ------------------------------------- | ------- | ------------------------------------------- |
| evento                                | string  | Sempre "envio\_produtos"                    |
| data\_hora                            | string  | Data e hora do evento (dd/mm/yyyy hh:mm:ss) |
| acao                                  | string  | "incluir" ou "alterar"                      |
| produtos\[]                           | array   | Lista de produtos afetados                  |
| produtos\[].id                        | int     | ID do produto no Olist ERP                  |
| produtos\[].sku                       | string  | Código SKU do produto                       |
| produtos\[].nome                      | string  | Nome do produto                             |
| produtos\[].preco                     | decimal | Preço de venda                              |
| produtos\[].preco\_promocional        | decimal | Preço promocional (se houver)               |
| produtos\[].unidade                   | string  | Unidade de medida                           |
| produtos\[].peso\_bruto               | decimal | Peso bruto em kg                            |
| produtos\[].peso\_liquido             | decimal | Peso líquido em kg                          |
| produtos\[].altura                    | decimal | Altura em cm                                |
| produtos\[].largura                   | decimal | Largura em cm                               |
| produtos\[].comprimento               | decimal | Comprimento em cm                           |
| produtos\[].ncm                       | string  | Código NCM                                  |
| produtos\[].origem                    | int     | Código de origem (0-8)                      |
| produtos\[].gtin                      | string  | Código de barras (GTIN/EAN)                 |
| produtos\[].categoria                 | string  | Caminho da categoria                        |
| produtos\[].estoque                   | decimal | Saldo em estoque                            |
| produtos\[].situacao                  | string  | A=Ativo, I=Inativo                          |
| produtos\[].tipo                      | string  | P=Produto, S=Serviço                        |
| produtos\[].classe\_ipi               | string  | Classe de IPI                               |
| produtos\[].codigo\_beneficio\_fiscal | string  | Código de benefício fiscal                  |
| produtos\[].anexos\[]                 | array   | Lista de imagens do produto                 |

## Exemplo de Implementação

### PHP

```php theme={null}
<?php
$json = file_get_contents('php://input');
$data = json_decode($json, true);

if ($data['evento'] === 'envio_produtos') {
    $acao = $data['acao'];

    foreach ($data['produtos'] as $produto) {
        if ($acao === 'incluir') {
            // Cria produto no sistema local
            criarProdutoLocal($produto);
        } else if ($acao === 'alterar') {
            // Atualiza produto no sistema local
            atualizarProdutoLocal($produto);
        }

        // Sincroniza com outros sistemas
        sincronizarProduto($produto['sku'], $produto);
    }

    http_response_code(200);
    echo json_encode(['status' => 'processado']);
}
?>
```

### Python

```python theme={null}
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/webhook/produtos', methods=['POST'])
def webhook_produtos():
    data = request.get_json()

    if data.get('evento') == 'envio_produtos':
        acao = data.get('acao')

        for produto in data.get('produtos', []):
            if acao == 'incluir':
                criar_produto_local(produto)
            elif acao == 'alterar':
                atualizar_produto_local(produto)

            # Sincroniza com marketplace
            sincronizar_marketplace(produto['sku'], produto)

        return jsonify({'status': 'processado'}), 200

    return jsonify({'status': 'erro'}), 400
```

### Node.js

```javascript theme={null}
const express = require('express');
const app = express();

app.use(express.json());

app.post('/webhook/produtos', async (req, res) => {
    const data = req.body;

    if (data.evento === 'envio_produtos') {
        const acao = data.acao;

        for (const produto of data.produtos) {
            if (acao === 'incluir') {
                await criarProdutoLocal(produto);
            } else if (acao === 'alterar') {
                await atualizarProdutoLocal(produto);
            }

            // Sincroniza com e-commerce
            await sincronizarEcommerce(produto.sku, produto);
        }

        res.status(200).json({ status: 'processado' });
    } else {
        res.status(400).json({ status: 'erro' });
    }
});

app.listen(3000);
```

## Configuração

Para ativar este webhook:

1. Acesse **Configurações > Integrações > Webhooks**
2. Clique em **Novo Webhook**
3. Selecione o evento **Envio de Produtos**
4. Informe a URL do seu endpoint
5. Salve as configurações

## Casos de Uso

* **Sincronização com e-commerce**: Mantenha seu site atualizado automaticamente
* **Integração com marketplace**: Envie produtos para múltiplos canais de venda
* **Sistema de precificação**: Atualize preços em sistemas externos
* **Catálogo unificado**: Centralize informações de produtos
* **Notificações**: Avise sua equipe sobre novos produtos

## Boas Práticas

* **Valide os dados**: Sempre verifique se os campos obrigatórios estão presentes
* **Trate duplicatas**: Use o campo `id` ou `sku` para evitar duplicação
* **Baixe imagens**: Salve as imagens localmente para melhor performance
* **Processe assincronamente**: Use filas para não bloquear o webhook
* **Log completo**: Registre todas as alterações para auditoria

## Observações

* O webhook inclui apenas produtos com situação "Ativo" por padrão
* Alterações de estoque não acionam este webhook (use o webhook de atualização de estoque)
* Produtos com múltiplas variações podem gerar notificações separadas
* Imagens grandes podem atrasar o processamento - implemente cache
* O campo `categoria` retorna o caminho completo separado por " > "
