Nimbus Rodizio API - Documentação

Modificado em Sex, 8 Mai na (o) 9:32 AM

Este documento apresenta um catálogo de endpoints disponíveis para integração com o Nimbus Rodízio, permitindo a troca de dados entre sistemas parceiros, podendo ser utilizado para consultar, enviar ou receber informações conforme necessidade.


URL:

Diferente para cada cliente, pois depende do IP do servidor local.


Endpoints:


Autenticação


Todas as requisições autenticadas devem enviar o header HTTP Authorization no formato Basic Auth.

Header obrigatório

Authorization: Basic <base64(username:password)>


Como montar o token Basic

  1. Concatenar usuário e senha no formato: usuario:senha
  2. Converter para Base64
  3. Enviar no header Authorization com prefixo Basic


Exemplo

Authorization: Basic dXN1YXJpbzpwYXNzMTIz

O valor Base64 acima representa usuario:pass123.


Regras de validação de autenticação

A API retorna 401 Unauthorized quando:

  • o header Authorization não é enviado;
  • o formato não é Basic <token>;
  • o token Base64 é inválido ou não representa usuario:senha;
  • usuário ou senha estão vazios;
  • usuário/senha não são validados com sucesso.


[get] /catalogs


Descrição

Retorna uma estrutura hierárquica contendo subgrupos (categorias), produtos e seus respectivos grupos de opções.


Tipo de Retorno de Sucesso

application/json


Modelo

NomeDescriçãoTipoFormataçãoInformações Adicionais
dataLista de subgrupos retornadosArray<SubGroup>-Não Nulo / Pode ser vazia


SubGroup

NomeDescriçãoTipoFormataçãoInformações Adicionais
idIdentificador do grupoInteger-Não Nulo
indexOrdem de exibiçãoInteger-Pode ser Nulo
descriptionNome/descrição do grupoString-Não Nulo
productsProdutos do grupoArray<Product>-Não Nulo / Pode ser vazia


Product

NomeDescriçãoTipoFormataçãoInformações Adicionais
idIdentificador do produtoInteger-Não Nulo
nameNome do produtoString-Não Nulo
imageCaminho/URL da imagemString-Pode ser Nulo
pricePreço baseDecimal-Não Nulo
descriptionDescriçãoString-Pode ser Nulo
productOptionsGroupsGrupos de opçõesArray<ProductOptionsGroup>-Não Nulo / Pode ser vazia


ProductOptionsGroup

NomeDescriçãoTipoFormataçãoInformações Adicionais
idIdentificador do grupo no produtoInteger-Não Nulo
chargeSe há cobrança adicionalBooleantrue/falseNão Nulo
requiredSe o grupo é obrigatórioBooleantrue/falseNão Nulo
numberOfAnswersMáximo de respostasInteger>= 0Não Nulo
optionGroupGrupo de opções detalhadoOptionGroup-Pode ser Nulo


OptionGroup

NomeDescriçãoTipoFormataçãoInformações Adicionais
idIdentificador do grupoInteger-Não Nulo
typeTipo do grupoStringR ou PR = resposta / P = produto
descriptionDescriçãoString-Pode ser Nulo
optionsOpções disponíveisArray<Option>-Não Nulo / Pode ser vazia


Option

NomeDescriçãoTipoFormataçãoInformações Adicionais
idIdentificador da opçãoInteger-Não Nulo
answerResposta associadaAnswer-Pode ser Nulo (type R)
productProduto associadoProductOption-Pode ser Nulo (type P)


Answer

NomeDescriçãoTipoFormataçãoInformações Adicionais
idIdentificador da respostaInteger-Não Nulo
descriptionTexto descritivoString-Pode ser Nulo


ProductOption

NomeDescriçãoTipoFormataçãoInformações Adicionais
idIdentificador do produtoInteger-Não Nulo
nameNome do produtoString-Não Nulo
pricePreço do adicionalDecimal-Não Nulo
descriptionDescriçãoString-Pode ser Nulo


Exemplo de Response

statusCode 200

{
  "data": [
    {
      "id": 10,
      "index": 1,
      "description": "Bebidas",
      "products": [
        {
          "id": 101,
          "name": "Refrigerante Lata",
          "image": "/products/101/image",
          "price": 8.5,
          "description": "Coca-Cola lata 350ml",
          "productOptionsGroups": [
            {
              "id": 9001,
              "charge": true,
              "required": true,
              "numberOfAnswers": 1,
              "optionGroup": {
                "id": 500,
                "type": "R",
                "description": "Escolha o sabor",
                "options": [
                  {
                    "id": 1,
                    "answer": {
                      "id": 11,
                      "description": "Uva"
                    },
                    "product": null
                  }
                ]
              }
            }
          ]
        }
      ]
    }
  ]
}


Imagem do Produto

[get] /products/{id}/image


Parâmetros da URI

NomeDescriçãoTipoFormataçãoInformações Adicionais
idIdentificador do produtoInteger-Requerido


Descrição

Retorna a imagem do produto informado pelo id.

  • Quando existir imagem para o produto, retorna o arquivo no content-type image/jpeg.
  • Quando o produto não possuir imagem, retorna 204 No Content.


Criar Faturamento

[post] /billings


Descrição

Cria um faturamento com base em uma venda feita.


Regras de Negócio

  • FaturamentoStatus sempre inicia como 4 (ABERTO).
  • Deve existir ao menos 1 item e 1 receivingMethod.
  • fulfillmentType é opcional na criação do faturamento. Quando não informado, o sistema assume DINE_IN.
  • fulfillmentType aceita apenas: PICKUP, DINE_IN e TAKEOUT.
  • total deve ser igual a subtotal - discount + fees.
  • subtotal deve ser igual a soma de items.totalPrice.
  • Soma de receivingMethods.amount deve ser igual a total.
  • Cada receivingMethod.amount deve ser maior que zero.
  • Cada receivingMethod.change não pode ser negativo.
  • Se customer.name ou customer.document não forem enviados, usa o cliente padrão CONSUMIDOR (id 2).
  • Documento é normalizado e validado por tamanho: 11 dígitos (CPF) ou 14 dígitos (CNPJ).
  • No CNPJ, os dados são enriquecidos via https://publica.cnpj.ws/cnpj/{cnpj}, com fallback de fantasia para razão social.
  • Complementos devem respeitar grupos obrigatórios, limite de respostas e consistência de option/answer/product.
  • quantity do complemento é obrigatória (> 0), inclusive para complemento de resposta.
  • unitPrice e totalPrice do complemento não podem ser negativos.
  • Quando productId for informado, unitPrice deve ser igual ao preço do produto no catálogo e totalPrice deve ser igual a unitPrice * quantity.
  • Quando productId for informado, o produto adicional precisa estar disponível no catálogo do estabelecimento.
  • Quando for complemento de resposta (answerId), unitPrice e totalPrice devem ser 0.
  • O backend recalcula o totalPrice do item e rejeita se divergir do valor enviado.


Modelo de Requisição

NomeDescriçãoTipoFormataçãoInformações Adicionais
totalValor total do faturamentoDecimal-Obrigatório
subtotalSoma dos itensDecimal-Obrigatório
discountDesconto totalDecimal-Obrigatório
feesTaxas adicionaisDecimal-Obrigatório
fulfillmentTypeTipo de atendimento do pedidoStringPICKUP / DINE_IN / TAKEOUTOpcional (padrão: DINE_IN)
observationObservação geralString-Opcional
receivingMethodsFormas de recebimentoArray<ReceivingMethodInput>-Obrigatório / mín. 1
itemsItens do faturamentoArray<ItemInput>-Obrigatório / mín. 1
customerCliente (CPF/CNPJ)CustomerInput-Opcional


ReceivingMethodInput

NomeDescriçãoTipoFormataçãoInformações Adicionais
receivingMethodIdID da forma de pagamentoInteger-Obrigatório
amountValor pagoDecimal> 0Obrigatório
changeTrocoDecimal>= 0Obrigatório


ItemInput

NomeDescriçãoTipoFormataçãoInformações Adicionais
productIdID do produtoInteger-Obrigatório
quantityQuantidade do itemDecimal> 0Obrigatório
unitPricePreço unitárioDecimal>= 0Obrigatório
totalPriceTotal do item. Calculado como (unitPrice * quantity) + soma dos complementos com charge = trueDecimal>= 0Obrigatório
observationObservação do itemString-Opcional
complementsComplementos do itemArray<ItemComplementInput>-Opcional


ItemComplementInput

NomeDescriçãoTipoFormataçãoInformações Adicionais
optionIdID da opção selecionadaInteger-Obrigatório
optionGroupIdID do grupo de opções (productOptionsGroups.optionGroup.id)Integer-Obrigatório
answerIdID da resposta textual (option.answer.id)Integer-Opcional
productIdID do produto adicional (option.product.id)Integer-Opcional
quantityQuantidade do complementoDecimal> 0Obrigatório
chargeSe deve cobrar o adicionalBooleantrue/falseOpcional
unitPriceValor unitário do complementoDecimal>= 0Obrigatório
totalPriceValor total do complementoDecimal>= 0Obrigatório


CustomerInput

NomeDescriçãoTipoFormataçãoInformações Adicionais
nameNome do clienteString-Opcional
documentCPF (11 dígitos) ou CNPJ (14 dígitos)String-Opcional


FulfillmentType

ValorDescrição
PICKUPPedido para retirada no local pelo cliente.
DINE_INPedido para consumo no local (mesa).
TAKEOUTPedido para levar.

No momento, o endpoint de criação de faturamento não aceita DELIVERY.


Exemplo de Request

statusCode 200

{
  "total": 47,
  "subtotal": 47,
  "discount": 0,
  "fees": 0,
  "fulfillmentType": "PICKUP",
  "observation": "Venda realizada no totem",
  "receivingMethods": [
    {
      "receivingMethodId": 1,
      "amount": 47,
      "change": 0
    }
  ],
  "customer": {
    "name": "Empresa Exemplo LTDA",
    "document": "11222333000181"
  },
  "items": [
    {
      "productId": 101,
      "quantity": 2,
      "unitPrice": 8.5,
      "totalPrice": 19,
      "complements": [
        {
          "optionId": 100,
          "optionGroupId": 20,
          "productId": 1700,
          "quantity": 1,
          "charge": true,
          "unitPrice": 2,
          "totalPrice": 2
        },
        {
          "optionId": 101,
          "optionGroupId": 21,
          "answerId": 13,
          "quantity": 1,
          "unitPrice": 0,
          "totalPrice": 0
        }
      ]
    }
  ]
}


Exemplo de Response

statusCode 200

{
  "data": {
    "id": 12345
  }
}


Consultar Faturamento

[get] /billings/{id}


Parâmetros da URI

NomeDescriçãoTipoFormataçãoInformações Adicionais
idIdentificador do faturamentoInteger-Requerido


Modelo de Resposta

NomeDescriçãoTipoFormataçãoInformações Adicionais
data.idID do faturamentoInteger-Não Nulo
data.totalValor totalDecimal-Não Nulo
data.subtotalSubtotalDecimal-Não Nulo
data.discountDescontoDecimal-Não Nulo
data.feesTaxasDecimal-Não Nulo
data.observationObservaçãoString-Pode ser Nulo
data.invoiceStatusStatus fiscalStringSOLICITADO/RECEBIDO/FINALIZADO/ERROPode ser Nulo
data.orderPasswordSenha do pedido para acompanhamento em tela externaString-Pode ser Nulo
data.createdAtData de criaçãoDateTimeISO-8601Não Nulo
data.typeTipo da vendaString-Pode ser Nulo
data.fulfillmentTypeTipo de atendimento do pedidoStringPICKUP/DINE_IN/TAKEOUT/DELIVERYPode ser Nulo
data.statusStatus operacionalObject{id,description}Não Nulo
data.customerDados do clienteObject{id,name,document}Não Nulo
data.receivingMethodsFormas de recebimentoArray-Não Nulo
data.itemsItens e complementosArray-Não Nulo


Exemplo de Response

statusCode 200

{
  "data": {
    "id": 12345,
    "total": 47,
    "subtotal": 47,
    "discount": 0,
    "fees": 0,
    "observation": "Venda realizada no totem",
    "invoiceStatus": "SOLICITADO",
    "orderPassword": "42",
    "createdAt": "2026-04-14T16:25:30",
    "type": "BALCAO",
    "fulfillmentType": "PICKUP",
    "status": {
      "id": 4,
      "description": "ABERTO"
    },
    "customer": {
      "id": 2,
      "name": "CONSUMIDOR",
      "document": null
    },
    "receivingMethods": [
      {
        "id": 77,
        "name": "PIX",
        "alias": "PIX",
        "amount": 47,
        "change": 0,
        "receivingMethodId": 1
      }
    ],
    "items": [
      {
        "id": 9876,
        "quantity": 2,
        "unitPrice": 8.5,
        "totalPrice": 19,
        "observation": "Sem cebola",
        "productId": 101,
        "complements": [
          {
            "id": 1,
            "optionId": 100,
            "answerId": null,
            "productId": 1700,
            "quantity": 1,
            "charge": true
          },
          {
            "id": 2,
            "optionId": 101,
            "answerId": 13,
            "productId": null,
            "quantity": 1,
            "charge": false
          }
        ]
      }
    ]
  }
}


Consultar Nota Fiscal do Faturamento

[get] /billings/{id}/invoice


Retorna o status fiscal atual vinculado ao faturamento informado.

Este endpoint deve ser utilizado como polling para acompanhar a emissão.

Quando ainda não existir status fiscal salvo, o backend inicializa com SOLICITADO.

Recomendação: realizar polling a cada 3 segundos.


Valores de status

StatusDescrição
SOLICITADOEmissão em processamento/consulta
RECEBIDORetorno fiscal recebido, sem XML final
FINALIZADOProcesso finalizado; quando houver XML, será retornado
ERROFalha no fluxo fiscal


Modelo de Resposta

NomeDescriçãoTipoFormataçãoInformações Adicionais
data.statusStatus fiscal do faturamentoStringSOLICITADO/RECEBIDO/FINALIZADO/ERRONão Nulo
data.xmlXML da nota fiscalStringXMLPode ser Nulo


Regras de retorno

  • O campo xml só é preenchido quando o status for FINALIZADO e houver XML da NFe/NFCe associado ao faturamento.
  • Em qualquer outro caso, xml será null.


Exemplo de Response

statusCode 200

{
  "data": {
    "status": "FINALIZADO",
    "xml": "<xml da nota fiscal>"
  }
}


Formas de Recebimento

[get] /receiving-methods


Descrição

Retorna a lista de formas de recebimento aceitas pelo sistema.


Modelo de Resposta

NomeDescriçãoTipoFormataçãoInformações Adicionais
dataLista de formas de recebimentoArray<ReceivingMethod>-Não Nulo / Pode ser vazia
idIdentificador únicoInteger-Não Nulo
nameNome exibidoString-Não Nulo
aliasCódigo internoString-Não Nulo


Exemplo de Response

statusCode 200

{
  "data": [
    {
      "id": 1,
      "name": "Cartao de Credito",
      "alias": "CARTAO CREDITO"
    },
    {
      "id": 2,
      "name": "PIX",
      "alias": "PIX"
    },
    {
      "id": 3,
      "name": "Dinheiro",
      "alias": "DIN"
    }
  ]
}


Este artigo foi útil?

Que bom!

Obrigado pelo seu feedback

Desculpe! Não conseguimos ajudar você

Obrigado pelo seu feedback

Deixe-nos saber como podemos melhorar este artigo!

Selecione pelo menos um dos motivos
A verificação do CAPTCHA é obrigatória.

Feedback enviado

Agradecemos seu esforço e tentaremos corrigir o artigo