Esta documentação descreve os endpoints da API do Zip Delivery para integração com sistemas de Ponto de Venda (PDV), como o Nuvel.
URL Base da API: [URL_DO_SEU_SITE]/api/v1/ (Ex: https://zipdelivery.com.br/api/v1/)
Todas as requisições à API devem ser autenticadas usando um Bearer Token universal. Este token deve ser enviado no cabeçalho HTTP Authorization.
Exemplo de cabeçalho:
Authorization: Bearer SEU_TOKEN_UNIVERSAL_PDV
TOKEN_NAO_CONFIGURADO_EM_config.php.config.php na raiz do sistema ZipDelivery.
Além do Bearer Token, todas as chamadas à API devem incluir o slug do restaurante alvo como um parâmetro na query string: ?restaurant_slug={slug_do_restaurante}.
Exemplo completo de requisição GET para buscar produtos:
GET [URL_DO_SEU_SITE]/api/v1/products.php?restaurant_slug=meu-restaurante\nAuthorization: Bearer SEU_TOKEN_UNIVERSAL_PDV
Se a autenticação falhar, a API retornará um status HTTP 401 Unauthorized.
Cria um ou mais produtos para o restaurante especificado. O corpo da requisição deve ser um array JSON de objetos de produto.
Corpo da Requisição (JSON - Array de Produtos):
[
{
"pdv_product_id": "SKU123", // Opcional: ID do produto no sistema PDV
"name": "Pizza Margherita",
"description": "Molho de tomate, muçarela, manjericão.",
"price": 35.00,
"category_id": "cat_pizzas", // Opcional, ID da categoria existente no ZipDelivery
"image_url": "https://exemplo.com/pizza.jpg", // Opcional
"customizable_ingredients": {
"max_free_selections": 1,
"available": [
{ "id": "ing_manjericao", "name": "Manjericão", "included_by_default": true },
{ "id": "ing_oregano", "name": "Orégano", "included_by_default": false }
]
},
"variation_groups": [
{
"id": "vgrp_tamanho_pizza", // ID do grupo (ZipDelivery gera se não enviado)
"group_name": "Tamanho",
"variations": [ // Note que 'selection_type' não é mais enviado, é sempre 'radio' por padrão na API
{ "id": "var_media", "name": "Média", "price_modifier": 0.00, "is_default": true },
{ "id": "var_grande", "name": "Grande", "price_modifier": 10.00, "is_default": false }
]
}
],
"options": [
{ "id": "opt_borda", "name": "Borda Recheada (Catupiry)", "price_increase": 5.00, "is_default": false }
]
},
{
"pdv_product_id": "SKU456",
"name": "Refrigerante Lata",
"price": 5.00
// ... outros campos opcionais
}
]
Nota sobre IDs: Para customizable_ingredients.available, variation_groups, variation_groups.variations, e options, você pode enviar um campo "id" se o item já existe no seu PDV e você quer manter uma referência. Se o "id" não for enviado para estes sub-itens, o ZipDelivery irá gerar um novo ID para eles.
Resposta de Sucesso (201 Created ou 207 Multi-Status):
{
"success": true, // true se todos os itens foram criados, false se houve erro em algum (no modo lote)
"message": "Operação de lote de produtos processada.", // ou "Produto criado com sucesso."
"results": [
{
"success": true,
"message": "Produto preparado para adição.",
"product_id": "prod_api_xxxx", // ID gerado pelo ZipDelivery
"pdv_product_id": "SKU123",
"product": { /* objeto do produto criado */ }
},
{
"success": false,
"message": "Nome e preço válido são obrigatórios para um produto.",
"input_pdv_id": "SKU_INVALIDO"
}
// ... outros resultados para cada item do lote
]
}
Lista todos os produtos associados ao restaurant_slug que foram criados via API (identificados por restaurant_slug_owner).
Resposta de Sucesso (200 OK):
{
"success": true,
"products": [
{ /* objeto do produto 1 */ },
{ /* objeto do produto 2 */ }
]
}
Cria uma ou mais categorias. O corpo da requisição deve ser um array JSON de objetos de categoria.
Corpo da Requisição (JSON - Array de Categorias):
[
{
"pdv_category_id": "CAT_PDV_01", // Opcional: ID da categoria no sistema PDV
"name": "Pizzas Especiais",
"variation_groups": [ /* mesma estrutura dos produtos */ ],
"options": [ /* mesma estrutura dos produtos */ ],
"customizable_ingredients": { /* mesma estrutura dos produtos */ }
},
{
"name": "Bebidas"
}
]
Resposta de Sucesso (201 Created ou 207 Multi-Status):
{
"success": true,
"message": "Operação de lote de categorias processada.",
"results": [
{
"success": true,
"message": "Categoria preparada para adição.",
"category_id": "cat_api_yyyy", // ID gerado pelo ZipDelivery
"pdv_category_id": "CAT_PDV_01",
"category": { /* objeto da categoria criada */ }
}
// ...
]
}
Lista todas as categorias associadas ao restaurant_slug que foram criadas via API.
Resposta de Sucesso (200 OK):
{
"success": true,
"categories": [
{ /* objeto da categoria 1 */ },
{ /* objeto da categoria 2 */ }
]
}
Cria um novo pedido local (originado no PDV) para o restaurante especificado.
Corpo da Requisição (JSON):
{
"customer": {
"name": "Cliente PDV",
"phone": "11999998888"
},
"payment": {
"method": "cash",
"cash_change_for": 50.00
},
"cart": {
"items": [
{
"productId": "prod_api_xxxx", // ID do produto no ZipDelivery (obtido ao criar/listar produtos)
"name": "Pizza Margherita", // Nome do produto (para referência)
"quantity": 1,
"unitPrice": 35.00,
"optionsPrice": 5.00,
"totalItemPrice": 40.00,
"selectedVariationGroups": [ { "group_id":"vgrp_tamanho_pizza", "id": "var_media", "name": "Média" } ],
"selectedOptions": [ { "id":"opt_borda", "name": "Borda Recheada" } ],
"selectedIngredients": [ {"id":"ing_manjericao", "name": "Manjericão"} ]
}
],
"subtotal": 40.00,
"total": 40.00
}
}
Nota sobre Itens do Pedido: Para selectedVariationGroups, selectedOptions, e selectedIngredients, envie os IDs correspondentes dos itens (group_id para o grupo de variação, id para a variação individual, opção ou ingrediente) que foram retornados ou definidos durante a criação do produto/categoria.
Resposta de Sucesso (201 Created):
{
"success": true,
"message": "Pedido criado com sucesso via PDV.",
"order_id": "pdv_api_zzzzzzzzz",
"order": { /* objeto do pedido criado */ }
}
Busca pedidos online com pagamento confirmado que precisam ser preparados pelo PDV. O PDV deve fazer polling neste endpoint periodicamente.
Parâmetros da Query String:
| Parâmetro | Descrição | Obrigatório |
|---|---|---|
restaurant_slug | Slug do restaurante. | Sim |
status | Deve ser pending_for_pdv. | Sim |
Resposta de Sucesso (200 OK):
{
"success": true,
"orders": [
{ /* objeto do pedido 1 que requer ação (status 'pending' ou 'preparing') */ }
]
}