Para desenvolvedores

Integração com APIs de terceiros

Conecte seu ERP, e-commerce ou sistema interno ao Venda no Chat. Você pode expor endpoints REST para carregamento inicial de dados (GET) e enviar atualizações em tempo real via webhook (push).

Configure credenciais em Integrações → APIs de terceiros no painel administrativo. Cada integração recebe um slug único usado como import_source e na URL do webhook.

Autenticação

Todas as requisições de saída (quando o Venda no Chat consulta suas APIs) e de entrada (webhook) usam o token configurado no painel.

Envie o header:

Texto
Authentication: bearer SEU_TOKEN

O formato é o mesmo da integração Nuvemshop. Também aceitamos Authorization: Bearer … no webhook.

Carregamento de dados

Para importar dados do seu sistema, informe no painel um endereço (URL) para cada tipo: produtos, clientes e vendas. O Venda no Chat consulta cada URL com requisições GET paginadas, usando o token de autenticação configurado na integração.

Cada endpoint deve responder com JSON. O corpo pode ser uma lista direta de registros (legado, página única) ou um objeto com a lista em uma das chaves data, results ou items, acompanhada de metadados de paginação. Campos adicionais nos objetos são ignorados.

Paginação

Durante o sync, o Venda no Chat chama sua URL repetidamente, enviando os parâmetros de query page e page_size=10. Cada resposta deve trazer no máximo 10 registros.

Exemplo de chamadas feitas pelo consumidor:

Texto
GET https://api.exemplo.com/produtos?page=1&page_size=10
GET https://api.exemplo.com/produtos?page=2&page_size=10
GET https://api.exemplo.com/produtos?page=3&page_size=10
… até a última página

Se a URL já tiver query string, os parâmetros de paginação são acrescentados (ou substituídos) automaticamente:

Texto
URL configurada: https://api.exemplo.com/v1/sales?status=closed
Chamada página 2: https://api.exemplo.com/v1/sales?status=closed&page=2&page_size=10

Formato recomendado da resposta paginada:

JSON
{
  "page": 1,
  "page_size": 10,
  "total": 47,
  "total_pages": 5,
  "has_more": true,
  "data": [
    {
      "name": "Produto A",
      "sku": "SKU-001",
      "price": 99.9
    }
  ]
}

Metadados reconhecidos para decidir se há próxima página:

CampoTipoObrigatórioDescrição
has_morebooleanNãoQuando presente, true indica que existem páginas seguintes.
total_pagesnumberNãoTotal de páginas. Comparado com page para saber se deve continuar.
total / countnumberNãoTotal de registros. Usado com page e page_size para calcular fim.
next_page / nextnumber | string | URLNãoPróxima página ou URL. Valor vazio encerra a paginação.
(fallback)NãoSe nenhum metadado existir, o consumidor continua enquanto a página retornar exatamente 10 itens.

A última página normalmente traz menos de 10 itens (ou uma lista vazia), o que encerra o sync daquele recurso.

Formato aceito — lista direta (legado, uma única requisição):

JSON
[
  {
    "name": "Produto A",
    "sku": "SKU-001",
    "price": 99.9
  }
]

Formato aceito — objeto com chave de lista:

JSON
{
  "data": [
    {
      "name": "Produto A",
      "sku": "SKU-001",
      "price": 99.9
    }
  ]
}

Abaixo estão os contratos de cada tipo. Cada subseção descreve o payload aceito para o respectivo endereço configurado no painel.

Produtos

Configure a URL da API de produtos em Integrações → APIs de terceiros. Esse endereço será consultado com paginação de 10 em 10 (veja Paginação). Cada item da lista segue o contrato abaixo.

Campos reconhecidos em cada item:

CampoTipoObrigatórioDescrição
namestringSimNome do produto exibido no catálogo.
skustringNãoCódigo único usado para identificar e atualizar o produto.
pricenumberNãoPreço de venda.
promotional_pricenumberNãoPreço promocional. Se maior que zero, marca o produto em promoção.
stockstring | numberNãoQuantidade em estoque.
brandstringNãoMarca do produto.
categoriesstring | arrayNãoCategorias separadas por vírgula ou lista de objetos com name.
descriptionstringNãoDescrição completa.
linkstring (URL)NãoLink público do produto no seu sistema.
image_urlstring (URL)NãoImagem principal.
image_urlsarrayNãoLista de URLs de imagens adicionais.
visible_in_storebooleanNãoSe o produto aparece na loja. Padrão: true.
is_on_salebooleanNãoIndica promoção ativa. Padrão: promotional_price > 0.
metadataobjectNãoMetadados livres em JSON (chaves alfanuméricas/underscore, valores string, number, boolean ou null). Em atualizações, as chaves enviadas são mescladas ao metadata existente. As chaves passam a ficar disponíveis como filtros opcionais no relatório de produtos.

Exemplo de item válido:

JSON
{
  "name": "Camiseta Premium",
  "sku": "CAM-PRE-001",
  "price": 129.9,
  "promotional_price": 99.9,
  "stock": "42",
  "brand": "Marca X",
  "categories": "Roupas, Camisetas",
  "description": "Camiseta 100% algodão.",
  "link": "https://loja.exemplo.com/produtos/camiseta-premium",
  "image_url": "https://cdn.exemplo.com/camiseta.jpg",
  "image_urls": [
    "https://cdn.exemplo.com/camiseta.jpg",
    "https://cdn.exemplo.com/camiseta-detalhe.jpg"
  ],
  "visible_in_store": true,
  "is_on_sale": true,
  "metadata": {
    "cor": "preto",
    "tamanho": "M",
    "material": "algodao",
    "garantia_meses": 12
  }
}

O campo metadata é um objeto JSON livre. Em updates (webhook ou sync), as chaves enviadas são mescladas ao metadata já gravado — chaves omitidas são preservadas. No painel, os metadados aparecem na ficha do produto e as chaves existentes no catálogo podem ser incluídas como filtros no relatório de produtos (Loja → Produtos).

Clientes

Configure a URL da API de clientes no painel. Esse endereço será consultado com paginação de 10 em 10. Cada item da lista segue o contrato abaixo.

Campos reconhecidos em cada item:

CampoTipoObrigatórioDescrição
full_namestringSimNome completo. Alternativa: first_name + last_name.
first_namestringNãoPrimeiro nome.
last_namestringNãoSobrenome.
emailstringNãoE-mail usado como chave principal de identificação.
phonestringNãoTelefone com DDD.
cpfstringNãoCPF ou CNPJ (apenas dígitos).
addressstringNãoLogradouro.
numberstringNãoNúmero.
complementstringNãoComplemento.
neighborhoodstringNãoBairro.
citystringNãoCidade.
statestringNãoEstado (UF).
zip_codestringNãoCEP.
total_spentnumberNãoTotal já gasto pelo cliente.
purchases_countnumberNãoQuantidade de compras.
last_purchasestringNãoData da última compra (ISO 8601 ou timestamp).
metadataobjectNãoMetadados livres em JSON (chaves alfanuméricas/underscore, valores string, number, boolean ou null). Em atualizações, as chaves enviadas são mescladas ao metadata existente. As chaves passam a ficar disponíveis como filtros opcionais no relatório de clientes.

Exemplo de item válido:

JSON
{
  "full_name": "Maria Silva",
  "email": "maria@exemplo.com",
  "phone": "47999998888",
  "cpf": "12345678901",
  "address": "Rua das Flores",
  "number": "100",
  "complement": "Apto 12",
  "neighborhood": "Centro",
  "city": "Itajaí",
  "state": "SC",
  "zip_code": "88301-000",
  "total_spent": 1549.8,
  "purchases_count": 7,
  "last_purchase": "2026-06-15T14:30:00-03:00",
  "metadata": {
    "segmento": "vip",
    "origem_lead": "instagram",
    "score": 92
  }
}

O campo metadata segue o mesmo padrão dos produtos: objeto JSON livre, merge parcial em updates, exibição na ficha do cliente e filtros opcionais no relatório (Loja → Clientes).

Vendas

Configure a URL da API de vendas no painel. Esse endereço será consultado com paginação de 10 em 10. Cada item da lista segue o contrato abaixo.

Campos reconhecidos em cada item:

CampoTipoObrigatórioDescrição
order_numberstringSimNúmero ou ID único do pedido.
emailstringNãoE-mail do comprador.
buyerstringNãoNome do comprador.
phonestringNãoTelefone do comprador.
datestringNãoData do pedido (ISO 8601).
subtotalnumberNãoSubtotal antes de descontos e frete.
discountnumberNãoValor de desconto.
shippingnumberNãoValor do frete.
totalnumberNãoValor total do pedido.
order_statusstringNãoStatus do pedido (ex.: open, closed, cancelled).
payment_statusstringNãoStatus do pagamento (ex.: paid, pending).
shipping_statusstringNãoStatus de envio.
payment_methodstringNãoForma de pagamento.
shipping_methodstringNãoForma de envio.
citystringNãoCidade de entrega.
statestringNãoEstado de entrega.
delivery_addressstringNãoEndereço completo de entrega.
sales_channelstringNãoCanal de venda (site, whatsapp, instagram, etc.). Padrão: site.
line_itemsarrayNãoItens do pedido para vincular produtos do catálogo.
metadataobjectNãoMetadados livres em JSON (chaves alfanuméricas/underscore, valores string, number, boolean ou null). Em atualizações, as chaves enviadas são mescladas ao metadata existente. As chaves passam a ficar disponíveis como filtros opcionais no relatório de vendas.

Itens do pedido (line_items):

CampoTipoObrigatórioDescrição
namestringSimNome do produto na linha do pedido.
skustringNãoSKU para vincular ao produto do catálogo.
quantitynumberNãoQuantidade comprada.
pricenumberNãoPreço unitário do item.

Exemplo de item válido:

JSON
{
  "order_number": "PED-2026-1042",
  "email": "maria@exemplo.com",
  "buyer": "Maria Silva",
  "phone": "47999998888",
  "date": "2026-06-28T10:15:00-03:00",
  "subtotal": 229.8,
  "discount": 10,
  "shipping": 15,
  "total": 234.8,
  "order_status": "open",
  "payment_status": "paid",
  "shipping_status": "shipped",
  "payment_method": "pix",
  "shipping_method": "express",
  "city": "Itajaí",
  "state": "SC",
  "delivery_address": "Rua das Flores, 100",
  "sales_channel": "site",
  "line_items": [
    {
      "name": "Camiseta Premium",
      "sku": "CAM-PRE-001",
      "quantity": 2,
      "price": 99.9
    }
  ],
  "metadata": {
    "cupom": "BEMVINDO10",
    "utm_source": "google",
    "parcelas": 1
  }
}

O sistema tenta vincular cada item do pedido a um produto existente pelo SKU ou pelo nome.

O campo metadata segue o mesmo padrão de produtos e clientes: merge parcial em updates, exibição na ficha da venda e filtros opcionais no relatório (Loja → Vendas).

Webhook (atualizações em tempo real)

Além do carregamento por GET, seu sistema pode enviar eventos para o Venda no Chat sempre que houver criação, alteração ou exclusão de registros.

URL do webhook

Substitua {workspace_slug} pelo slug do workspace e {integration_slug} pelo slug da integração:

Texto
POST https://vendanochat.com.br/api/integrations/{workspace_slug}/third-party/{integration_slug}

O slug e a URL completa aparecem em Integrações → APIs de terceiros no painel.

Headers

Texto
Content-Type: application/json
Authentication: bearer SEU_TOKEN

Corpo da requisição

Todas as requisições seguem o formato:

JSON
{
  "event": "product.upsert",
  "data": {}
}

Eventos suportados

CampoTipoObrigatórioDescrição
product.upserteventSimCria ou atualiza um produto (data = objeto).
product.created / product.updatedeventSimAlias de product.upsert.
product.deleteeventSimRemove produto por sku ou name.
customer.upserteventSimCria ou atualiza um cliente (data = objeto).
customer.created / customer.updatedeventSimAlias de customer.upsert.
customer.deleteeventSimRemove cliente por email ou full_name.
sale.upserteventSimCria ou atualiza uma venda (data = objeto).
sale.created / sale.updatedeventSimAlias de sale.upsert.
sale.delete / order.deleteeventSimRemove venda por order_number.
products.synceventSimLote de produtos (data = array).
customers.synceventSimLote de clientes (data = array).
sales.synceventSimLote de vendas (data = array).

Exemplos

Criar ou atualizar produto:

JSON
{
  "event": "product.upsert",
  "data": {
    "name": "Camiseta Premium",
    "sku": "CAM-PRE-001",
    "price": 129.9,
    "stock": "40",
    "metadata": {
      "cor": "preto",
      "tamanho": "M"
    }
  }
}

Atualizar cliente:

JSON
{
  "event": "customer.upsert",
  "data": {
    "full_name": "Maria Silva",
    "email": "maria@exemplo.com",
    "phone": "47999998888",
    "city": "Itajaí",
    "state": "SC",
    "metadata": {
      "segmento": "vip",
      "origem_lead": "instagram"
    }
  }
}

Nova venda:

JSON
{
  "event": "sale.upsert",
  "data": {
    "order_number": "PED-2026-1043",
    "email": "maria@exemplo.com",
    "buyer": "Maria Silva",
    "total": 199.8,
    "payment_status": "paid",
    "line_items": [
      {
        "sku": "CAM-PRE-001",
        "name": "Camiseta Premium",
        "quantity": 2,
        "price": 99.9
      }
    ],
    "metadata": {
      "cupom": "BEMVINDO10",
      "utm_source": "google"
    }
  }
}

Lote de produtos:

JSON
{
  "event": "products.sync",
  "data": [
    {
      "name": "Produto A",
      "sku": "A-001",
      "price": 10
    },
    {
      "name": "Produto B",
      "sku": "B-002",
      "price": 20
    }
  ]
}

Excluir venda:

JSON
{
  "event": "sale.delete",
  "data": {
    "order_number": "PED-2026-0999"
  }
}

Respostas

Em caso de sucesso:

JSON
{
  "ok": true,
  "action": "created",
  "id": 123
}

Em caso de erro de validação:

JSON
{
  "ok": false,
  "message": "Produto inválido: informe ao menos o campo name."
}

Códigos HTTP: 200 sucesso, 400 payload inválido, 403 não autorizado ou integração desativada, 404 workspace não encontrado.

Precisa de ajuda?

Consulte a central de ajuda ou fale com o suporte em atendimento.