Next · Retaguarda Riser 3

Especificação de integração

Integração de PDV Externo

Como enviar vendas, cupons fiscais e fechamento de caixa para o ERP Next.

Documento
Contrato de recebimento
Versão
1.1
Data
17 de agosto de 2026
Destinatário
Equipe técnica de integração
Protocolo
HTTPS · REST · arquivo texto
Situação
Em produção

Este documento descreve o canal já utilizado em produção por lojas de food service que operam PDV de terceiros. O contrato aqui especificado é o mesmo, sem variações por cliente. Nenhuma credencial está incluída — elas são entregues separadamente no provisionamento (§2.4).

1

Visão geral

O PDV envia arquivos; o Next transforma em movimento operacional.

O Next recebe a operação de caixa de um PDV externo por uma API REST. O PDV monta um arquivo texto com o movimento do dia e o entrega por HTTP. Não há consulta ativa do lado do Next: quem inicia a comunicação é sempre o PDV.

São três coisas que podem ser enviadas, em dois formatos:

Escopo do canal — o que o Next aceita receber
O quêFormatoEndpointSituação
Vendas do dia
contas, itens e pagamentos
Texto delimitado por |POST /vendaAtivo — é o essencial
Cupom fiscal
NFC-e, CF-e e cancelamento
XMLPOST /nfceAtivo — opcional
Fechamento financeiroTexto delimitado por |POST /financeiroDescontinuado — não usar
Não implemente o endpoint de financeiro

O POST /financeiro ainda responde 200 com sucesso, mas descarta o conteúdo sem processar. Ele foi desativado por decisão de produto e a resposta de sucesso existe apenas para que integrações antigas parem de reenviar. O fechamento de caixa hoje é gerado pelo próprio Next a partir do arquivo de vendas (§1.1).

1.1Como o dado atravessa o sistema

O arquivo não vira venda imediatamente. Ele passa por uma área de estagiamento, onde cada linha é decomposta em pares campo/valor. Só depois que os códigos de produto e forma de pagamento estão correlacionados aos cadastros do Next (§7) o movimento é materializado. Os demais códigos — vendedor e motivos de desconto e cancelamento — apenas ficam sinalizados como pendentes e não retêm o dia.

SEU PDV RECEPÇÃO (SÍNCRONA) EFETIVAÇÃO Arquivo do dia R01…R99 1 por loja / por dia Autenticação Apiguid define o container Arquivo salvo disco · 90 dias + registro do import Estagiamento 1 linha vira N pares campo/valor Correlação código do PDV → cadastro do Next Vendas contas, itens, pagamentos Fechamento de caixa + estoque HTTPS se resolvida resposta enviada aqui pendente até correlacionar
Figura 1. O arquivo é confirmado assim que fica seguro em disco — antes da efetivação. A resposta de sucesso significa recebido, não processado (§3.3).
Duas ideias que explicam o resto do documento

1. O arquivo é do dia, não do evento. O envio é um lote diário com o movimento completo da loja, e não uma chamada por venda.

2. O Next não conhece seus códigos. Produto e forma de pagamento chegam com o código do seu sistema e precisam ser associados uma única vez aos cadastros do Next. Enquanto isso não acontece, o dia fica retido (§7).

2

Conexão

Um endereço e um identificador por ambiente do Next.

2.1Endereço

Cada ambiente tem seu próprio subdomínio. A base é:

https://{entidade}.retaguarda.altec.app.br/webs/api

{entidade}  nome do ambiente da loja no Next, informado no provisionamento
Não use o endereço antigo

Um endereço equivalente em {entidade}.r3.riser.com.br ainda responde, e você pode encontrá-lo em materiais anteriores. Não o utilize. O domínio riser.com.br está em desativação e deixará de resolver; o endereço acima é o definitivo.

Mantenha o host em arquivo de configuração, nunca fixo no código — e confirme o endereço com a equipe do Next no provisionamento antes do primeiro envio.

Rotas — todas relativas à base acima
MétodoRotaFinalidade
GET/Teste de disponibilidade. Responde cd_erro: 11.
POST/vendaArquivo de vendas do dia (§4).
POST/nfceXML de cupom fiscal, um por chamada (§5).
POST/financeiroDescontinuado. Não utilizar.
Barra final no teste de disponibilidade

O ping responde em /webs/api/ com a barra final. Sem ela o servidor devolve um 301 para o endereço com barra — se o seu cliente HTTP não seguir redirecionamentos, o health check falha sem motivo aparente. Monte a URL já com a barra.

2.2Autenticação

A autenticação é feita por um identificador fixo enviado no cabeçalho HTTP Apiguid. Não há OAuth, token de expiração ou renovação — o identificador é permanente até ser revogado.

Apiguid: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
O formato importa

O valor tem 38 caracteres e inclui as chaves { } — elas fazem parte do identificador e não devem ser removidas. O nome do cabeçalho deve ser enviado exatamente como Apiguid.

Duas propriedades do identificador merecem atenção porque afetam o desenho da sua integração:

2.3Limites técnicos

Transporte
HTTPS — certificado público válido
Corpo
multipart/form-data ou x-www-form-urlencoded
Tamanho máximo
200 MB por requisição — inclui a inflação de ~33% do Base64
Tempo máximo
1200 s no servidor — mas a resposta chega em segundos (§3.3). Configure o timeout do seu cliente com folga, por volta de 120 s
Codificação
Texto do arquivo em ASCII/UTF-8, sem BOM

Para dimensionar: um dia de movimento de uma casa com cerca de 95 contas e 640 linhas gera um arquivo de aproximadamente 50 KB. A folga em relação ao limite é de várias ordens de grandeza.

Use HTTPS mesmo que HTTP responda

O endereço também atende em http:// sem redirecionar para https://. Não use. O identificador de acesso viaja no cabeçalho da requisição a cada envio; em HTTP ele trafega em texto claro e pode ser capturado. Fixe https:// na configuração da sua integração e não a torne dependente de redirecionamento.

2.4O que você recebe no provisionamento

Antes do primeiro envio, a equipe do Next entrega — por canal seguro, nunca neste documento — os três valores abaixo, um conjunto por ambiente:

Ambiente, não loja

O Apiguid identifica o ambiente de destino, não a loja nem o CNPJ. Normalmente há um ambiente por loja e os dois conceitos coincidem — mas, se duas lojas compartilharem o mesmo ambiente, elas compartilham URL e identificador, e o campo cnpj não separa uma da outra. Confirme o mapeamento loja → ambiente antes de codificar e trate o par (entidade, Apiguid) como a chave de roteamento da sua configuração.

ValorUsoExemplo de forma
entidadeMonta a URL da lojaminhaloja
ApiguidCabeçalho de autenticação{XXXXXXXX-…-XXXXXXXXXXXX}
CNPJCampo do corpo da requisição00000000000000

Do seu lado, informe: os IPs de origem (se quiser a lista restrita) e a relação de lojas a integrar, com o CNPJ de cada uma.

3

Envio

Como montar a requisição e o que fazer com a resposta.

3.1A requisição

O arquivo não vai como upload binário: vai como um campo de formulário contendo o conteúdo em Base64.

Campos do corpoPOST /venda
CampoObrigatórioConteúdo
cnpjsimCNPJ da loja, apenas dígitos, sem pontuação.
nm_arquivosimNome do arquivo. Use apenas A-Z a-z 0-9 _ . - — sem espaços, acentos ou aspas. É a chave de duplicidade (§8.1).
arquivosimConteúdo do arquivo codificado em Base64.
POST /webs/api/venda HTTP/1.1
Host: {entidade}.retaguarda.altec.app.br
Apiguid: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
Content-Type: multipart/form-data; boundary=----limite

------limite
Content-Disposition: form-data; name="cnpj"

00000000000000
------limite
Content-Disposition: form-data; name="nm_arquivo"

EXPORTACAO_OLGA_NEXT_00000000000000_20260817.txt
------limite
Content-Disposition: form-data; name="arquivo"

fFIwMXwyMDI2MDgxN3w5NXwyMDZ8Mjc2MjguOTB8...  (Base64 do .txt)
------limite--
Convenção de nome recomendada

Use um nome determinístico que inclua o CNPJ e a data do movimento, no padrão já praticado:

EXPORTACAO_{SISTEMA}_NEXT_{CNPJ}_{AAAAMMDD}.txt

3.2A resposta

A resposta é sempre JSON com dois campos:

{ "cd_erro": 1, "msg": "Sucesso!" }
Não use o status HTTP para decidir

Quase todos os retornos — inclusive os de erro — vêm com HTTP 200. Apenas dois fogem disso: cd_erro 2 retorna 401 e cd_erro 4 retorna 404. Sua integração deve ler cd_erro do corpo; tratar 200 como sucesso vai mascarar falhas de autenticação (2 e 8) e de campo obrigatório ausente (5, 6 e 7). A tabela completa está em §10.1.

Nem toda resposta é JSON. Erros de borda — rota incorreta, corpo acima do limite, indisponibilidade, timeout — são produzidos pelo servidor web antes da aplicação e vêm em HTML ou vazios. Se a decodificação falhar, ou se o corpo não contiver cd_erro, trate como falha de transporte — nem sucesso, nem rejeição definitiva — e reenvie com espera progressiva.

O CNPJ não é conferido — quem decide o destino é o identificador

Apesar da mensagem do cd_erro 9 sugerir o contrário, o Next não valida o CNPJ enviado contra o cadastro da loja. O destino dos dados é definido exclusivamente pelo Apiguid.

Consequência prática: enviar o CNPJ de outra loja retorna cd_erro 1 e os dados são gravados normalmente no ambiente do identificador usado. Confirme o CNPJ de cada loja no provisionamento — um valor errado não produz erro em lugar nenhum.

3.3A confirmação é antecipada

Este é o ponto do contrato mais fácil de interpretar errado. O processamento de um arquivo com milhares de linhas leva tempo — mais do que o tempo de espera típico de um cliente HTTP. Para evitar que o PDV conclua por engano que o envio falhou e reenvie em laço, o Next responde assim que o arquivo está gravado com segurança e só depois processa.

Seu PDV Next POST /venda valida identificador grava arquivo em disco 200 · cd_erro 1 a conexão fecha aqui — pode marcar como enviado interpreta as linhas correlaciona cadastros gera vendas e fechamento nada mais é enviado ao PDV rápido demorado
Figura 2. cd_erro 1 confirma recebimento. Erros que ocorrem depois da resposta não chegam ao PDV — ficam no registro de importações do Next.

O que isso significa na prática

3.4Rotina diária recomendada

A prática consolidada em produção é um envio por loja, uma vez ao dia, após o fechamento da casa — tipicamente por volta das 22h. A ordem importa quando há cupom fiscal:

  1. Envie o arquivo de vendas (POST /venda) e aguarde cd_erro 1.
  2. Envie os XMLs (POST /nfce), um por chamada, referenciando o número da conta.
A ordem inversa também funciona

Se um XML chegar antes da venda correspondente, o vínculo é refeito quando a venda é processada. Enviar vendas primeiro apenas evita reprocessamento desnecessário.

4

Arquivo de vendas

O layout campo a campo. Esta é a parte normativa do documento.

4.1Regras do formato

Delimitador
barra vertical |
Cada linha
começa e termina com |
Primeiro campo
o tipo do registro: R01R99
Fim de linha
CRLF ou LF — ambos aceitos
Codificação
ASCII / UTF-8 sem BOM
Campo vazio
dois delimitadores seguidos: ||
Não use aspas duplas no conteúdo

O interpretador trata " como delimitador de texto quando ela é o primeiro caractere de um campo. São três casos, todos silenciosos:

  • No meio ou no fimREFRIGERANTE 2" — é mantida e não causa problema.
  • Abrindo e fechando o campo"BATATA" GRANDE — as aspas são removidas e a descrição chega diferente da enviada.
  • Abrindo sem fechar"PROMO 2 POR 1 — o interpretador entra em modo texto e passa a engolir os | e as quebras de linha, consumindo os registros seguintes até achar outra aspa. Um único caso destes pode fazer várias contas do dia desaparecerem, sem nenhuma mensagem de erro.

Remova ou substitua aspas duplas antes de gerar o arquivo.

A validação do arquivo é sua — o endpoint não a faz

Este é o ponto mais importante do capítulo. O POST /venda não verifica a estrutura do arquivo. Ele confere apenas o identificador de acesso e a presença dos três campos do corpo; o conteúdo é interpretado linha a linha, e tudo que não for reconhecido é ignorado sem erro.

Na prática, um arquivo com registro faltando, campo deslocado ou tipo desconhecido recebe cd_erro 1 — sucesso — e só falha depois, em silêncio, longe da sua chamada. Como a confirmação é antecipada (§3.3), essa falha não volta para você.

Trate as regras deste capítulo como obrigações do seu gerador, não como algo que o servidor vai cobrar. O roteiro de §9.2 existe exatamente para isso.

4.2Estrutura

O arquivo é hierárquico e ordenado. Um cabeçalho, um rodapé, e no meio as contas — cada uma seguida de seus itens e pagamentos.

R01 Cabeçalho do movimento exatamente 1 por arquivo · abre o dia e define a data de todas as linhas R02 Conta / venda 1 por conta fechada · traz o número da conta que amarra tudo abaixo R03 Item vendido 0..N por conta · o produto propriamente dito, com valor e quantidade R04 Modificador do item 0..N · acompanha o R03 imediatamente anterior (guarnição, ponto, adicional) R05 Pagamento 1..N por conta · uma linha por transação, inclusive troco e repique R99 Rodapé exatamente 1 · última linha · carrega o CNPJ e a contagem de linhas
Figura 3. A ordem é significativa: um R04 pertence ao R03 anterior, e itens e pagamentos pertencem ao R02 anterior.
A data vem só do R01

Os registros R02, R03, R04 e R05 trazem apenas a hora (HH:MM). A data usada é sempre a do R01. Por isso o R01 deve ser a primeira linha e o arquivo deve conter um único dia de movimento. Uma casa que vira a madrugada continua no mesmo movimento — a hora 02:30 será gravada na data do R01.

4.3R01 · Cabeçalho do movimento

Nove campos. Abre o arquivo e define a data de referência.

R01|R01|20260817|95|206|27628,90|0|789,1700|2604,66|29444,39|
#CampoFormatoObservação
1TipoR01Literal.
2Data do movimentoAAAAMMDDCrítico. Formato diferente interrompe a importação (§6.2).
3Quantidade de contasinteiroInformativo.
4Quantidade de clientesinteiroInformativo.
5Venda brutadecimal BRInformativo.
6Cancelamentosdecimal BRUsado no fechamento.
7Descontosdecimal BRUsado no fechamento e rateado por venda.
8Taxas adicionaisdecimal BRUsado no fechamento.
9Pagamentosdecimal BRInformativo.
Informativo × usado

Os campos marcados informativo são armazenados e exibidos na tela de importação, mas não alimentam cálculo. Os totais que efetivamente compõem o fechamento de caixa são cancelamentos, descontos e taxas adicionais. Ainda assim, preencha todos com valores corretos: eles são a conferência do operador contra o relatório do seu PDV.

Use esta identidade para validar seu gerador

Os totais do R01 se fecham entre si. Vale a pena conferir esta igualdade antes de enviar — ela detecta a maior parte dos erros de montagem:

pagamentos = venda_brutacancelamentosdescontos + taxas_adicionais
   [9]           [5]            [6]             [7]           [8]

Repare que venda_bruta é o consumo dos itens, sem a taxa de serviço — a taxa entra depois, na soma. Tolere diferença de centavos por arredondamento.

Cancelamentos é um valor, não uma contagem

O campo 6 é a soma em reais dos itens cancelados no dia, não a quantidade deles. Quando não houver cancelamento, envie 0.

4.4R02 · Conta

Doze campos. Uma linha por conta fechada.

R02|R02|14|MARIA|2446444|41|12:07|12:34|1|101,36|11,66|1|0|
#CampoFormatoObservação
1TipoR02Literal.
2Código do operadortextoCorrelacionável a um usuário do Next (não bloqueia).
3Nome do operadortexto
4Número da contatextoChave. Amarra itens e pagamentos. Deve ser único no dia.
5Mesa / comandatextoRegistrado no atendimento.
6Hora de aberturaHH:MMCombinada com a data do R01.
7Hora de fechamentoHH:MMCombinada com a data do R01.
8Parte do diainteiroNão utilizado na importação. Envie 1 ou 2.
9Total da contadecimal BRObrigatório. Valor a pagar, com a taxa de serviço.
10Taxa de serviçodecimal BRContida no campo 9. O consumo é calculado por diferença.
11Quantidade de pessoasinteiroRegistrado no atendimento.
12Centro de rendatextoArmazenado; não mapeado. Envie 0 se não aplicável.

4.5R03 · Item vendido

Dezesseis campos. O produto propriamente dito.

R03|R03|33|JOAO|2446505|20:16|201002|AGUA C/ GAS|1|0|0|8,00|1.000|0,0000|0|1T1800|3|
#CampoFormatoObservação
1TipoR03Literal.
2Código do operadortexto
3Nome do operadortexto
4Número da contatextoObrigatório. Igual ao R02 correspondente.
5Hora do lançamentoHH:MM
6Código do produtotextoBloqueante. Precisa ser correlacionado (§7).
7Descrição do produtotextoExibida na tela de correlação. Sem aspas duplas.
8Modo de pedidotextoTipo do produto na origem. Armazenado, mas não utilizado — o Next classifica o item pelo próprio cadastro. Só existe no R03.
9Cancelado0 / 11 cancela o item; qualquer outro valor o mantém ativo.
10Motivo do cancelamentotextoLido apenas quando o campo 9 é 1.
11Valordecimal BRAtenção. É o total da linha, não o unitário (§6.1).
12Quantidadedecimal com pontoAtenção. Vírgula é truncada em silêncio (§6.1).
13Descontodecimal BRValor total do desconto da linha.
14Código do descontotextoCorrelacionável (não bloqueia). 0 se não houver.
15Índice fiscalcompostoFormato {ECF}T{alíquota} (§6.3).
16TerminaltextoCampo reservado. Hoje não é aproveitado — envie mesmo assim, mas não espere vê-lo em relatórios por terminal.

4.6R04 · Modificador

Quinze campos: idêntico ao R03, sem o campo 8 (modo de pedido). Todos os campos a partir da posição 8 deslocam uma casa à esquerda.

R04|R04|16|JOAO|2446489|15:35|103009|MOLHO EXTRA|0|0|0,00|1.000|0,0000|0|1T1800|2|
#CampoEquivale ao R03Observação
1–7Tipo … Descrição1–7Iguais ao R03.
8Cancelado9Deslocados uma posição por não existir o campo modo de pedido.
9Motivo do cancelamento10
10Valor11
11Quantidade12
12Desconto13
13Código do desconto14
14Índice fiscal15
15Terminal16
Quando usar R04

Use o R04 para o que acompanha um item — guarnição, ponto da carne, adicional, observação com preço. Ele é vinculado ao R03 imediatamente anterior. Um modificador com valor 0,00 é perfeitamente válido. Se o seu PDV não tem esse conceito, simplesmente não gere linhas R04: elas são opcionais.

4.7R05 · Pagamento

Oito campos. Uma linha por transação de pagamento.

R05|R05|10|CAIXA|2446512|22:03|50|MASTER CREDITO|138,71|
#CampoFormatoObservação
1TipoR05Literal.
2Código do operadortexto
3Nome do operadortexto
4Número da contatextoObrigatório. Igual ao R02 correspondente.
5Hora do pagamentoHH:MM
6Código da formatextoBloqueante. Precisa ser correlacionado (§7).
7Nome da formatextoSemântico. Determina troco e repique — veja abaixo.
8Valordecimal BRPode ser negativo.

Troco e repique são identificados pelo nome

Esta é a regra mais sutil do layout. O Next classifica cada linha R05 lendo o nome da forma de pagamento (campo 7), sem diferenciar maiúsculas de minúsculas — não o código:

Nome no campo 7ClassificaçãoValor esperado
REPIQUERepique (gorjeta)negativo
TROCOTroconegativo
DINHEIRO com valor negativoTroco (compatibilidade)negativo
qualquer outroPagamentopositivo
O código pode se repetir; o nome é que decide

Em produção é comum que DINHEIRO e REPIQUE compartilhem o mesmo código de forma de pagamento. Isso é aceitável — mas significa que o nome precisa vir exatamente como REPIQUE ou TROCO nessas linhas. A comparação é por igualdade exata, ignorando apenas maiúsculas/minúsculas e espaços nas pontas.

Uma variação como REPIQUE GARÇOM não é reconhecida: com valor negativo a linha é descartada em silêncio e a gorjeta não é registrada em lugar nenhum; com valor positivo entra como pagamento comum. Nos dois casos o fechamento fica errado.

4.8R99 · Rodapé

Três campos. Deve ser a última linha do arquivo.

R99|R99|642|00000000000000|
#CampoFormatoObservação
1TipoR99Literal.
2Total de linhasinteiroContagem de todas as linhas do arquivo, incluindo R01 e R99.
3CNPJ14 dígitosObrigatório. Sem pontuação. Usado na recuperação manual.

4.9Exemplo completo

Um arquivo mínimo válido, com uma conta, dois itens, um modificador e dois pagamentos (um deles repique):

|R01|20260817|1|2|108,10|0|0,0000|10,80|118,90|
|R02|14|MARIA|1000501|12|19:40|21:05|2|118,90|10,80|2|0|
|R03|14|MARIA|1000501|19:42|201002|AGUA C/ GAS|1|0|0|16,00|2.000|0,0000|0|1T1800|3|
|R03|14|MARIA|1000501|19:55|102043|FILE AO MOLHO|1|0|0|92,10|1.000|0,0000|0|1T1800|3|
|R04|14|MARIA|1000501|19:55|103009|PONTO AO PONTO|0|0|0,00|1.000|0,0000|0|1T1800|3|
|R05|10|CAIXA|1000501|21:05|50|MASTER CREDITO|118,95|
|R05|10|CAIXA|1000501|21:05|1|REPIQUE|-0,05|
|R99|8|00000000000000|

Conferindo o exemplo — vale usar como teste do seu gerador:

5

Cupom fiscal

Envio do XML de NFC-e, CF-e e cancelamento.

O envio de cupom fiscal é opcional e independente do arquivo de vendas. Serve para que o Next guarde o documento fiscal e o vincule à venda correspondente.

5.1Requisição

Mesma autenticação do §2.2. Um XML por chamada. O corpo tem um campo a mais:

Campos do corpoPOST /nfce
CampoObrigatórioConteúdo
cnpjsimCNPJ da loja, apenas dígitos.
nm_arquivosimNome de referência do XML.
arquivosimXML completo em Base64.
venda_idsimNúmero da conta — o mesmo do campo 4 do R02. Sem ele: cd_erro 14.
venda_id é o elo

É por venda_id que o cupom encontra a venda. Ele deve ser exatamente o mesmo número de conta enviado no R02. Um valor divergente não gera erro — o XML é gravado sem vínculo, e a venda fica sem documento fiscal.

5.2Tipos aceitos

O tipo é determinado pelo primeiro elemento filho da raiz — não pela raiz em si. Essa distinção importa na hora de escolher qual arquivo enviar:

Raiz do XML1º filho (é ele que decide)Documento e tratamento
nfeProcNFeNFC-e autorizada — registrada com série, número, protocolo e QR Code.
CFeinfCFeCF-e de venda (SAT) — registrado com número e chave de acesso.
CFeCancinfCFe com chCancCancelamento de CF-e — cancela a venda vinculada.
envEventoidLoteCancelamento de NFC-e — aceito só com tpEvento = 110111; outro evento retorna cd_erro 16.
Qualquer outro primeiro filho — recusado com cd_erro 13.
Envie o documento completo, não o interno

Não envie a NFe avulsa (sem o envelope nfeProc) nem o procEventoNFe: nesses casos o primeiro filho é outro e a chamada retorna cd_erro 13. É do envelope completo que saem protocolo e QR Code.

6

Formatos e conversões

Onde a maioria dos erros de integração acontece.

As três subseções abaixo concentram os pontos que costumam falhar em silêncio — sem mensagem de erro, com número errado gravado. Vale conferir cada uma contra o gerador do seu PDV.

6.1Números: dois formatos no mesmo arquivo

Valores monetários e quantidade não são convertidos da mesma forma. Isso não aparece em operação normal — e é justamente por isso que merece atenção.

CampoConversão aplicadaSeparador decimalExemplo
Valor, desconto, totaisConversão monetária brasileiravírgula92,10 · 1.234,56
Quantidade (R03/R04)Conversão numérica simplesponto2.000 · 0.750
Por que quantidade fracionada exige ponto

A quantidade passa por uma conversão numérica que para no primeiro caractere não numérico. Com vírgula, a parte decimal é descartada sem aviso:

EnviadoGravado
2.5002.500correto
2,5002.000meia unidade perdida, em silêncio
0,7500.000pior caso — quantidade zero faz a linha entrar valendo zero e sumir do faturamento
2,0002.000correto por coincidência — a parte descartada era zero

Observação de campo: os PDVs hoje integrados enviam quantidade com vírgula e casas decimais sempre zeradas (1,000, 2,000) — e por isso nunca perderam valor. Se o seu PDV vende fracionado (peso, buffet por quilo, dose), essa coincidência não protege você: use ponto.

Nunca envie separador de milhar

O ponto só é entendido como milhar quando o campo também tem vírgula decimal. Sozinho, ele é lido como decimal — e o valor é dividido por mil, sem erro e sem registro:

EnviadoGravado
1234,561.234,56correto — a forma recomendada
1.234,561.234,56correto — tem vírgula, o ponto vira milhar
1.2341,23mil vezes menor — sem vírgula, o ponto vira decimal
12.00012,00doze reais em vez de doze mil

A regra segura é uma só: sem separador de milhar, sempre com as duas casas decimais1234,56, 16,00, -0,05.

Envie apenas números nos campos de valor

O campo não é validado. Símbolo de moeda (R$ 16,00), texto (N/A, ISENTO), hífen como marcador ou campo em branco interrompem o processamento no meio do arquivo — e, como a confirmação já foi enviada (§3.3), o dia fica parcialmente importado sem aviso nenhum.

Campo sem valor deve ir como 0,00 — nunca vazio, nunca hífen.

Resumo prático:

6.2Datas e horas

OndeFormatoExemploSe vier diferente
R01 · data do movimentoAAAAMMDD20260817Com separador: interrompe a importação. Outra sequência de dígitos: aceita em silêncio, com data errada.
R02/R03/R04/R05 · horaHH:MM19:42Não validado. Data/hora inválida gravada na venda.
A data do R01 não é validada — ela é lida por posição

O campo é interpretado posicionalmente como AAAAMMDD, sem conferência de faixa. Há dois desfechos, ambos ruins e ambos silenciosos:

  • Com separador (17/08/2026, 2026-08-17): a conversão falha e interrompe o processamento. Como a resposta de sucesso já foi enviada (§3.3), o PDV não é avisado.
  • Outra sequência numérica: é aceita e normalizada. Enviar 17082026 no formato DDMMAAAA não gera erro — gera um movimento em uma data completamente diferente.

A data errada contamina todas as vendas do arquivo e ainda desarma a proteção contra duplicidade por dia (§8). Garantir 8 dígitos em AAAAMMDD, com data real, é responsabilidade inteiramente do seu gerador.

As horas são concatenadas à data do R01, e o Next acrescenta os segundos. Envie exatamente HH:MM, com dois dígitos — 09:05, não 9:5 — e não inclua segundos: 19:42:31 produz uma data e hora malformada.

6.3Índice fiscal

Este campo é informativo

O Next guarda as duas partes junto ao registro de importação, mas não usa este campo para tributar a venda — a tributação vem do cadastro do produto no Next. Um valor malformado aqui não interrompe nem rejeita a importação. Envie 0 quando não houver o que informar.

O campo de índice fiscal do R03/R04 é composto, separado pela letra T:

  1 T 1800
  │   │    │
  │   │    └── alíquota sem separador decimal → 18.00 %
  │   └─────── separador literal, sempre a letra T
  └─────────── índice da alíquota no equipamento fiscal

A alíquota é lida por posição: os dois primeiros dígitos são a parte inteira, o restante são as casas decimais.

EnviadoInterpretadoSituação
1T180018,00 %Correto — formato canônico
1T070007,00 %Correto — complete com zero à esquerda
1T70070,00 %Errado — sem o zero à esquerda a leitura posicional inverte
1T12,5012,00 %Nunca envie — separador é lido como casa decimal; use 1T1250
1T1818,00 %Aceito, mas prefira 1T1800
0sem alíquotaAceito quando não há tributação a informar
7

Correlação de cadastros

Por que o primeiro dia exige trabalho manual — e por que só o primeiro.

O Next não conhece a codificação de produtos do seu PDV. Quando um código chega pela primeira vez, ele fica em espera até que um operador da loja o associe a um cadastro do Next. Essa associação é aprendida — mas só passa a valer para os arquivos seguintes depois que o arquivo em que ela foi feita for concluído. Um arquivo que continua pendente não ensina nada ao próximo.

Código no arquivo já foi associado? sim Resolvido automaticamente nenhuma ação humana não Aguarda associação operador da loja, uma única vez aprende Venda efetivada entra no faturamento Enquanto pendente, apenas produto e forma de pagamento retêm o dia inteiro
Figura 4. A associação é feita uma única vez por código. Novos produtos no cardápio reabrem o processo apenas para eles.

7.1O que bloqueia e o que não bloqueia

A distinção é importante para você calibrar as expectativas da loja:

Campo do arquivoOrigemEfeito se não correlacionado
ProdutoR03 campo 6 / R04 campo 6Retém o dia inteiro
Forma de pagamentoR05 campo 6Retém o dia inteiro
Operador / vendedorR02/R03/R04/R05 campo 2Não retém — a venda entra
Motivo de descontoR03 campo 14 / R04 campo 13Não retém
Motivo de cancelamentoR03 campo 10 / R04 campo 9Não retém
Configuração de RepiqueR05 com nome REPIQUENão retém — configuração do Next, resolvida uma vez pelo suporte

7.2Recomendações para reduzir o atrito

8

Idempotência

O que acontece se o mesmo arquivo for enviado duas vezes.

8.1A chave é o nome do arquivo

A verificação de duplicidade usa o nome informado em nm_arquivo — não o conteúdo. Não há verificação de integridade por hash. Duas consequências práticas:

8.2Comportamento no reenvio

Situação do envio anteriorO que aconteceRetorno
Nunca enviadoProcessa normalmente.1
Enviado, ainda não concluídoReaproveita. Descarta a leitura anterior e reprocessa do zero — inclusive associações que a loja tenha feito neste arquivo pendente.1
O dia de movimento já tem fechamento no NextRecusa. Protege contra duplicação de faturamento.3
Reenviar o mesmo conteúdo é seguro

O reenvio de um arquivo que ficou pendente é o caminho normal de recuperação e não duplica vendas. Além da checagem por nome, há proteção por dia de movimento e por venda individual.

Duas ressalvas antes de automatizar o reenvio

1. Reenvie o mesmo conteúdo. Uma venda já gravada é reconhecida por um conjunto de dados — número da conta, hora de abertura e valor total, entre outros — e não apenas pelo número. Se o reenvio trouxer hora ou valor alterados para uma conta já gravada, ela não é reconhecida: a venda é criada de novo e o estoque baixa em duplicidade, sem erro nem aviso.

2. Não reenvie automaticamente arquivos pendentes. As associações que o operador tenha acabado de fazer no arquivo ainda pendente são descartadas no reprocessamento, e a loja terá de refazê-las. Combine o reenvio com a loja.

O que o cd_erro 3 realmente diz

Ele significa "o dia já está fechado", e não necessariamente "o seu arquivo já foi processado com sucesso". Um dia fechado por outra via — upload manual, outro arquivo, ou fechamento feito no próprio Next — também devolve 3. Para reimportar, o dia precisa ser reaberto pelo suporte.

8.3Falhas parciais

O processamento não é uma transação única do arquivo: cada venda é gravada individualmente. Se ocorrer uma falha no meio, as vendas já gravadas permanecem e o arquivo fica pendente. O reenvio completa o que faltou — as vendas já existentes são reconhecidas e não são duplicadas.

Números de conta devem ser únicos no movimento

Dentro do arquivo, os pagamentos são ligados à venda pela igualdade do número da conta — o campo 4 do R05 é comparado com o do R02. Os itens, por sua vez, pertencem estruturalmente ao R02 que os precede.

Se duas contas distintas tiverem o mesmo número, cada uma receberá os pagamentos das duas, inflando o total recebido do dia — enquanto os itens ficam corretos, o que torna a divergência difícil de perceber. Se o seu PDV reinicia a numeração por turno ou por terminal, componha um número único (por exemplo, prefixando o terminal) antes de gerar o R02.

9

Homologação

Roteiro para validar a integração antes de entrar em produção.

A equipe do Next disponibiliza um ambiente de testes com identificador próprio. Sugerimos percorrer os passos abaixo na ordem — cada um isola uma classe de problema.

9.1Conectividade e autenticação

9.2Estrutura do arquivo

9.3Conteúdo e valores

9.4Operação

Critério de aceite sugerido

Três dias consecutivos de movimento real enviados automaticamente, com fechamento conferido pela loja e nenhuma intervenção manual no período.

10

Referência

Códigos de retorno e vocabulário.

10.1Códigos de retorno

Campo cd_erro — sempre presente no corpo da resposta
CódigoHTTPMensagemComo tratar
1200Sucesso!Recebido. Marque como enviado e não reenvie.
2401Acesso negado!Identificador inválido, inativo ou IP não autorizado. Não reenvie: verifique a configuração.
3200Arquivo já existe!Já processado e concluído. Trate como sucesso.
4404Rota não encontradaRota inexistente. Revise a URL.
5200O CNPJ não foi informado!Campo cnpj ausente ou vazio.
6200O nome do arquivo não foi informado!Campo nm_arquivo ausente ou vazio.
7200Arquivo vazio ou não informado!Campo arquivo ausente ou Base64 vazio.
8200Token inválido ou não informado!Cabeçalho Apiguid ausente. Verifique o nome exato.
9200CNPJ inválido ou não licenciado!Ambiente sem local de estoque configurado. Acione o suporte. Apesar da mensagem, o CNPJ enviado não é conferido contra o cadastro (§3.2).
10200Não existe local de estoque…Configuração pendente no Next. Acione o suporte.
11200API Disponível!Resposta do ping.
12200Erro ao ler arquivo!/nfce: XML malformado.
13200Estrutura de arquivo inválida…/nfce: elemento raiz não reconhecido.
14200O ID da venda não foi informado!/nfce: campo venda_id ausente.
15200Não foi possivel cadastrar as informações do XML!Falha ao gravar o documento fiscal.
16200Tipo de evento não esperado em tpEvento!/nfce: tpEvento diferente de 110111.
17200Não foi possível concluir a importação de vendas!Falha na efetivação. Não chega ao PDV nesta rota — a resposta já foi enviada (§3.3). Aparece só na tela de importações.
O contrato é o número, não o texto

Use sempre o campo numérico cd_erro em condicionais e testes. O texto de msg é informativo e pode variar entre versões — não faça parsing dele.

10.2Glossário

Entidade
Nome do ambiente de uma loja no Next; compõe o subdomínio da URL.
Apiguid
Identificador permanente de acesso à API, específico por loja.
Conta
Uma venda fechada. Equivale a mesa, comanda ou cupom, conforme a operação.
Repique
Gorjeta ao garçom. Trafega como pagamento de valor negativo.
Correlação
Associação entre um código do seu PDV e um cadastro do Next.
Movimento
O conjunto da operação de um dia em uma loja.
Fechamento
Consolidação do movimento por forma de pagamento, gerada pelo Next.

10.3Resumo do contrato

Os dez pontos que definem uma integração correta
  1. Um arquivo por loja, por dia, com um único dia de movimento.
  2. POST /venda com cnpj, nm_arquivo e arquivo em Base64.
  3. Cabeçalho Apiguid com as chaves { }.
  4. Decisão sempre por cd_erro, nunca pelo status HTTP.
  5. cd_erro 1 significa recebido — não reenviar.
  6. Linhas delimitadas por | nas duas pontas, sem aspas duplas.
  7. Data do R01 em AAAAMMDD; horas em HH:MM.
  8. Quantidade com ponto; valores com vírgula; valor é o total da linha.
  9. Repique e troco identificados pelo nome, com valor negativo.
  10. Nome de arquivo determinístico e único por loja e por dia — é a chave de duplicidade.

Sobre este documento. O conteúdo foi levantado diretamente do código-fonte do Next e conferido contra arquivos reais em operação. As contagens de campo de §9.2 foram validadas em 178 arquivos de 12 lojas ativas, com aderência integral ao layout descrito. As regras de conversão numérica de §6 foram verificadas contra mais de 500 mil linhas de itens reais.

Os pontos assinalados como armadilha correspondem a comportamentos verificados, não a suposições: cada um deles falha em silêncio, sem retorno de erro. É por isso que o capítulo 9 existe.

Dúvidas sobre este contrato ou solicitação de ambiente de homologação: canal de suporte técnico do Next.

Next · Retaguarda Riser 3 — Especificação de integração de PDV externo, versão 1.1, 17 de agosto de 2026.