Documentação da API - Zip Delivery PDV

Introdução

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/)

Autenticação

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
ATENÇÃO DESENVOLVEDOR DO PDV: O Bearer Token universal é: TOKEN_NAO_CONFIGURADO_EM_config.php.
Este token é secreto e deve ser configurado de forma segura no seu sistema PDV. Não o exponha no código do lado do cliente ou em locais públicos. Se o token acima indicar "NÃO CONFIGURADO", verifique o arquivo 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.

Produtos

POST /products.php?restaurant_slug={slug_do_restaurante}

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
    ]
}

GET /products.php?restaurant_slug={slug_do_restaurante}

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 */ }
    ]
}

Categorias

POST /categories.php?restaurant_slug={slug_do_restaurante}

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 */ }
        }
        // ...
    ]
}

GET /categories.php?restaurant_slug={slug_do_restaurante}

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 */ }
    ]
}

Pedidos

POST /orders.php?restaurant_slug={slug_do_restaurante}

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 */ }
}

GET /orders.php?restaurant_slug={slug_do_restaurante}&status=pending_for_pdv

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âmetroDescriçãoObrigatório
restaurant_slugSlug do restaurante.Sim
statusDeve 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') */ }
    ]
}