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:
- Catálogo
- Imagem do Produto
- Criar Faturamento
- Consultar Faturamento
- Consultar Nota Fiscal do Faturamento
- Formas de Recebimento
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
- Concatenar usuário e senha no formato: usuario:senha
- Converter para Base64
- 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.
Catálogo
[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
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| data | Lista de subgrupos retornados | Array<SubGroup> | - | Não Nulo / Pode ser vazia |
SubGroup
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| id | Identificador do grupo | Integer | - | Não Nulo |
| index | Ordem de exibição | Integer | - | Pode ser Nulo |
| description | Nome/descrição do grupo | String | - | Não Nulo |
| products | Produtos do grupo | Array<Product> | - | Não Nulo / Pode ser vazia |
Product
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| id | Identificador do produto | Integer | - | Não Nulo |
| name | Nome do produto | String | - | Não Nulo |
| image | Caminho/URL da imagem | String | - | Pode ser Nulo |
| price | Preço base | Decimal | - | Não Nulo |
| description | Descrição | String | - | Pode ser Nulo |
| productOptionsGroups | Grupos de opções | Array<ProductOptionsGroup> | - | Não Nulo / Pode ser vazia |
ProductOptionsGroup
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| id | Identificador do grupo no produto | Integer | - | Não Nulo |
| charge | Se há cobrança adicional | Boolean | true/false | Não Nulo |
| required | Se o grupo é obrigatório | Boolean | true/false | Não Nulo |
| numberOfAnswers | Máximo de respostas | Integer | >= 0 | Não Nulo |
| optionGroup | Grupo de opções detalhado | OptionGroup | - | Pode ser Nulo |
OptionGroup
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| id | Identificador do grupo | Integer | - | Não Nulo |
| type | Tipo do grupo | String | R ou P | R = resposta / P = produto |
| description | Descrição | String | - | Pode ser Nulo |
| options | Opções disponíveis | Array<Option> | - | Não Nulo / Pode ser vazia |
Option
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| id | Identificador da opção | Integer | - | Não Nulo |
| answer | Resposta associada | Answer | - | Pode ser Nulo (type R) |
| product | Produto associado | ProductOption | - | Pode ser Nulo (type P) |
Answer
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| id | Identificador da resposta | Integer | - | Não Nulo |
| description | Texto descritivo | String | - | Pode ser Nulo |
ProductOption
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| id | Identificador do produto | Integer | - | Não Nulo |
| name | Nome do produto | String | - | Não Nulo |
| price | Preço do adicional | Decimal | - | Não Nulo |
| description | Descrição | String | - | 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
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| id | Identificador do produto | Integer | - | 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
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| total | Valor total do faturamento | Decimal | - | Obrigatório |
| subtotal | Soma dos itens | Decimal | - | Obrigatório |
| discount | Desconto total | Decimal | - | Obrigatório |
| fees | Taxas adicionais | Decimal | - | Obrigatório |
| fulfillmentType | Tipo de atendimento do pedido | String | PICKUP / DINE_IN / TAKEOUT | Opcional (padrão: DINE_IN) |
| observation | Observação geral | String | - | Opcional |
| receivingMethods | Formas de recebimento | Array<ReceivingMethodInput> | - | Obrigatório / mín. 1 |
| items | Itens do faturamento | Array<ItemInput> | - | Obrigatório / mín. 1 |
| customer | Cliente (CPF/CNPJ) | CustomerInput | - | Opcional |
ReceivingMethodInput
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| receivingMethodId | ID da forma de pagamento | Integer | - | Obrigatório |
| amount | Valor pago | Decimal | > 0 | Obrigatório |
| change | Troco | Decimal | >= 0 | Obrigatório |
ItemInput
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| productId | ID do produto | Integer | - | Obrigatório |
| quantity | Quantidade do item | Decimal | > 0 | Obrigatório |
| unitPrice | Preço unitário | Decimal | >= 0 | Obrigatório |
| totalPrice | Total do item. Calculado como (unitPrice * quantity) + soma dos complementos com charge = true | Decimal | >= 0 | Obrigatório |
| observation | Observação do item | String | - | Opcional |
| complements | Complementos do item | Array<ItemComplementInput> | - | Opcional |
ItemComplementInput
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| optionId | ID da opção selecionada | Integer | - | Obrigatório |
| optionGroupId | ID do grupo de opções (productOptionsGroups.optionGroup.id) | Integer | - | Obrigatório |
| answerId | ID da resposta textual (option.answer.id) | Integer | - | Opcional |
| productId | ID do produto adicional (option.product.id) | Integer | - | Opcional |
| quantity | Quantidade do complemento | Decimal | > 0 | Obrigatório |
| charge | Se deve cobrar o adicional | Boolean | true/false | Opcional |
| unitPrice | Valor unitário do complemento | Decimal | >= 0 | Obrigatório |
| totalPrice | Valor total do complemento | Decimal | >= 0 | Obrigatório |
CustomerInput
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| name | Nome do cliente | String | - | Opcional |
| document | CPF (11 dígitos) ou CNPJ (14 dígitos) | String | - | Opcional |
FulfillmentType
| Valor | Descrição |
| PICKUP | Pedido para retirada no local pelo cliente. |
| DINE_IN | Pedido para consumo no local (mesa). |
| TAKEOUT | Pedido 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
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| id | Identificador do faturamento | Integer | - | Requerido |
Modelo de Resposta
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| data.id | ID do faturamento | Integer | - | Não Nulo |
| data.total | Valor total | Decimal | - | Não Nulo |
| data.subtotal | Subtotal | Decimal | - | Não Nulo |
| data.discount | Desconto | Decimal | - | Não Nulo |
| data.fees | Taxas | Decimal | - | Não Nulo |
| data.observation | Observação | String | - | Pode ser Nulo |
| data.invoiceStatus | Status fiscal | String | SOLICITADO/RECEBIDO/FINALIZADO/ERRO | Pode ser Nulo |
| data.orderPassword | Senha do pedido para acompanhamento em tela externa | String | - | Pode ser Nulo |
| data.createdAt | Data de criação | DateTime | ISO-8601 | Não Nulo |
| data.type | Tipo da venda | String | - | Pode ser Nulo |
| data.fulfillmentType | Tipo de atendimento do pedido | String | PICKUP/DINE_IN/TAKEOUT/DELIVERY | Pode ser Nulo |
| data.status | Status operacional | Object | {id,description} | Não Nulo |
| data.customer | Dados do cliente | Object | {id,name,document} | Não Nulo |
| data.receivingMethods | Formas de recebimento | Array | - | Não Nulo |
| data.items | Itens e complementos | Array | - | 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
| Status | Descrição |
| SOLICITADO | Emissão em processamento/consulta |
| RECEBIDO | Retorno fiscal recebido, sem XML final |
| FINALIZADO | Processo finalizado; quando houver XML, será retornado |
| ERRO | Falha no fluxo fiscal |
Modelo de Resposta
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| data.status | Status fiscal do faturamento | String | SOLICITADO/RECEBIDO/FINALIZADO/ERRO | Não Nulo |
| data.xml | XML da nota fiscal | String | XML | Pode 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
| Nome | Descrição | Tipo | Formatação | Informações Adicionais |
| data | Lista de formas de recebimento | Array<ReceivingMethod> | - | Não Nulo / Pode ser vazia |
| id | Identificador único | Integer | - | Não Nulo |
| name | Nome exibido | String | - | Não Nulo |
| alias | Código interno | String | - | 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
Feedback enviado
Agradecemos seu esforço e tentaremos corrigir o artigo