Especificação de integração
Como enviar vendas, cupons fiscais e fechamento de caixa para o ERP Next.
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).
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:
| O quê | Formato | Endpoint | Situação |
|---|---|---|---|
| Vendas do dia contas, itens e pagamentos | Texto delimitado por | | POST /venda | Ativo — é o essencial |
| Cupom fiscal NFC-e, CF-e e cancelamento | XML | POST /nfce | Ativo — opcional |
| Fechamento financeiro | Texto delimitado por | | POST /financeiro | Descontinuado — não usar |
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).
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.
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).
Um endereço e um identificador por ambiente do Next.
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
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.
| Método | Rota | Finalidade |
|---|---|---|
GET | / | Teste de disponibilidade. Responde cd_erro: 11. |
POST | /venda | Arquivo de vendas do dia (§4). |
POST | /nfce | XML de cupom fiscal, um por chamada (§5). |
POST | /financeiro | Descontinuado. Não utilizar. |
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.
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 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:
Apiguid — e não o subdomínio da URL —
que define em qual ambiente os dados serão gravados. Um identificador enviado para o
subdomínio errado ainda grava no ambiente correto. Mantenha o par
identificador + subdomínio consistente por loja.200.1.2.0/24 não autoriza ninguém. O endereço
conferido é o IP de origem visto pelo servidor, que pode diferir do seu se houver proxy ou NAT no
caminho. O padrão liberado é qualquer origem; só peça a lista restrita se a sua saída
tiver IP fixo, e valide antes com a equipe do Next — do contrário a autenticação passa a falhar
com cd_erro 2, indistinguível de identificador revogado.multipart/form-data ou x-www-form-urlencodedPara 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.
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.
Antes do primeiro envio, a equipe do Next entrega — por canal seguro, nunca neste documento — os três valores abaixo, um conjunto por ambiente:
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.
| Valor | Uso | Exemplo de forma |
|---|---|---|
| entidade | Monta a URL da loja | minhaloja |
| Apiguid | Cabeçalho de autenticação | {XXXXXXXX-…-XXXXXXXXXXXX} |
| CNPJ | Campo do corpo da requisição | 00000000000000 |
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.
Como montar a requisição e o que fazer com a resposta.
O arquivo não vai como upload binário: vai como um campo de formulário contendo o conteúdo em Base64.
| Campo | Obrigatório | Conteúdo |
|---|---|---|
cnpj | sim | CNPJ da loja, apenas dígitos, sem pontuação. |
nm_arquivo | sim | Nome do arquivo. Use apenas A-Z a-z 0-9 _ . - — sem espaços, acentos ou aspas. É a chave de duplicidade (§8.1). |
arquivo | sim | Conteú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--
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
A resposta é sempre JSON com dois campos:
{ "cd_erro": 1, "msg": "Sucesso!" }
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.
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.
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.
cd_erro 1 confirma recebimento. Erros que ocorrem
depois da resposta não chegam ao PDV — ficam no registro de importações do Next.cd_erro 1, marque o arquivo como entregue e não reenvie.
Reenvio em laço é justamente o que este desenho evita.nm_arquivo, que reaproveita
o registro e reprocessa do zero (§8.2) — isso não contradiz a regra acima, que veta o reenvio
em laço logo após o cd_erro 1.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:
POST /venda) e aguarde
cd_erro 1.POST /nfce), um por chamada, referenciando o
número da conta.Se um XML chegar antes da venda correspondente, o vínculo é refeito quando a venda é processada. Enviar vendas primeiro apenas evita reprocessamento desnecessário.
O layout campo a campo. Esta é a parte normativa do documento.
||R01 … R99CRLF ou LF — ambos aceitos||O interpretador trata " como delimitador de texto quando ela é o
primeiro caractere de um campo. São três casos, todos silenciosos:
REFRIGERANTE 2" — é mantida e não causa problema."BATATA" GRANDE — as aspas são removidas e
a descrição chega diferente da enviada."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.
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.
O arquivo é hierárquico e ordenado. Um cabeçalho, um rodapé, e no meio as contas — cada uma seguida de seus itens e pagamentos.
R04 pertence ao
R03 anterior, e itens e pagamentos pertencem ao R02 anterior.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.
Nove campos. Abre o arquivo e define a data de referência.
| # | Campo | Formato | Observação |
|---|---|---|---|
| 1 | Tipo | R01 | Literal. |
| 2 | Data do movimento | AAAAMMDD | Crítico. Formato diferente interrompe a importação (§6.2). |
| 3 | Quantidade de contas | inteiro | Informativo. |
| 4 | Quantidade de clientes | inteiro | Informativo. |
| 5 | Venda bruta | decimal BR | Informativo. |
| 6 | Cancelamentos | decimal BR | Usado no fechamento. |
| 7 | Descontos | decimal BR | Usado no fechamento e rateado por venda. |
| 8 | Taxas adicionais | decimal BR | Usado no fechamento. |
| 9 | Pagamentos | decimal BR | Informativo. |
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.
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_bruta − cancelamentos − descontos + 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.
O campo 6 é a soma em reais dos itens cancelados no dia, não a quantidade deles. Quando
não houver cancelamento, envie 0.
Doze campos. Uma linha por conta fechada.
| # | Campo | Formato | Observação |
|---|---|---|---|
| 1 | Tipo | R02 | Literal. |
| 2 | Código do operador | texto | Correlacionável a um usuário do Next (não bloqueia). |
| 3 | Nome do operador | texto | — |
| 4 | Número da conta | texto | Chave. Amarra itens e pagamentos. Deve ser único no dia. |
| 5 | Mesa / comanda | texto | Registrado no atendimento. |
| 6 | Hora de abertura | HH:MM | Combinada com a data do R01. |
| 7 | Hora de fechamento | HH:MM | Combinada com a data do R01. |
| 8 | Parte do dia | inteiro | Não utilizado na importação. Envie 1 ou 2. |
| 9 | Total da conta | decimal BR | Obrigatório. Valor a pagar, com a taxa de serviço. |
| 10 | Taxa de serviço | decimal BR | Contida no campo 9. O consumo é calculado por diferença. |
| 11 | Quantidade de pessoas | inteiro | Registrado no atendimento. |
| 12 | Centro de renda | texto | Armazenado; não mapeado. Envie 0 se não aplicável. |
Dezesseis campos. O produto propriamente dito.
| # | Campo | Formato | Observação |
|---|---|---|---|
| 1 | Tipo | R03 | Literal. |
| 2 | Código do operador | texto | — |
| 3 | Nome do operador | texto | — |
| 4 | Número da conta | texto | Obrigatório. Igual ao R02 correspondente. |
| 5 | Hora do lançamento | HH:MM | — |
| 6 | Código do produto | texto | Bloqueante. Precisa ser correlacionado (§7). |
| 7 | Descrição do produto | texto | Exibida na tela de correlação. Sem aspas duplas. |
| 8 | Modo de pedido | texto | Tipo do produto na origem. Armazenado, mas não utilizado — o Next classifica o item pelo próprio cadastro. Só existe no R03. |
| 9 | Cancelado | 0 / 1 | 1 cancela o item; qualquer outro valor o mantém ativo. |
| 10 | Motivo do cancelamento | texto | Lido apenas quando o campo 9 é 1. |
| 11 | Valor | decimal BR | Atenção. É o total da linha, não o unitário (§6.1). |
| 12 | Quantidade | decimal com ponto | Atenção. Vírgula é truncada em silêncio (§6.1). |
| 13 | Desconto | decimal BR | Valor total do desconto da linha. |
| 14 | Código do desconto | texto | Correlacionável (não bloqueia). 0 se não houver. |
| 15 | Índice fiscal | composto | Formato {ECF}T{alíquota} (§6.3). |
| 16 | Terminal | texto | Campo reservado. Hoje não é aproveitado — envie mesmo assim, mas não espere vê-lo em relatórios por terminal. |
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.
| # | Campo | Equivale ao R03 | Observação |
|---|---|---|---|
| 1–7 | Tipo … Descrição | 1–7 | Iguais ao R03. |
| 8 | Cancelado | 9 | Deslocados uma posição por não existir o campo modo de pedido. |
| 9 | Motivo do cancelamento | 10 | |
| 10 | Valor | 11 | |
| 11 | Quantidade | 12 | |
| 12 | Desconto | 13 | |
| 13 | Código do desconto | 14 | |
| 14 | Índice fiscal | 15 | |
| 15 | Terminal | 16 |
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.
Oito campos. Uma linha por transação de pagamento.
| # | Campo | Formato | Observação |
|---|---|---|---|
| 1 | Tipo | R05 | Literal. |
| 2 | Código do operador | texto | — |
| 3 | Nome do operador | texto | — |
| 4 | Número da conta | texto | Obrigatório. Igual ao R02 correspondente. |
| 5 | Hora do pagamento | HH:MM | — |
| 6 | Código da forma | texto | Bloqueante. Precisa ser correlacionado (§7). |
| 7 | Nome da forma | texto | Semântico. Determina troco e repique — veja abaixo. |
| 8 | Valor | decimal BR | Pode ser negativo. |
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 7 | Classificação | Valor esperado |
|---|---|---|
REPIQUE | Repique (gorjeta) | negativo |
TROCO | Troco | negativo |
DINHEIRO com valor negativo | Troco (compatibilidade) | negativo |
| qualquer outro | Pagamento | positivo |
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.
Três campos. Deve ser a última linha do arquivo.
| # | Campo | Formato | Observação |
|---|---|---|---|
| 1 | Tipo | R99 | Literal. |
| 2 | Total de linhas | inteiro | Contagem de todas as linhas do arquivo, incluindo R01 e R99. |
| 3 | CNPJ | 14 dígitos | Obrigatório. Sem pontuação. Usado na recuperação manual. |
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:
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.
Mesma autenticação do §2.2. Um XML por chamada. O corpo tem um campo a mais:
| Campo | Obrigatório | Conteúdo |
|---|---|---|
cnpj | sim | CNPJ da loja, apenas dígitos. |
nm_arquivo | sim | Nome de referência do XML. |
arquivo | sim | XML completo em Base64. |
venda_id | sim | Número da conta — o mesmo do campo 4 do R02. Sem ele: cd_erro 14. |
É 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.
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 XML | 1º filho (é ele que decide) | Documento e tratamento |
|---|---|---|
nfeProc | NFe | NFC-e autorizada — registrada com série, número, protocolo e QR Code. |
CFe | infCFe | CF-e de venda (SAT) — registrado com número e chave de acesso. |
CFeCanc | infCFe com chCanc | Cancelamento de CF-e — cancela a venda vinculada. |
envEvento | idLote | Cancelamento de NFC-e — aceito só com tpEvento = 110111; outro evento retorna cd_erro 16. |
Qualquer outro primeiro filho — recusado com cd_erro 13. | ||
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.
tpEvento
110111).tpEvento para SAT — enviar um evento não
cancela nada.venda_id deve ser o mesmo da venda original.cd_erro 12.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.
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.
| Campo | Conversão aplicada | Separador decimal | Exemplo |
|---|---|---|---|
| Valor, desconto, totais | Conversão monetária brasileira | vírgula | 92,10 · 1.234,56 |
| Quantidade (R03/R04) | Conversão numérica simples | ponto | 2.000 · 0.750 |
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:
| Enviado | Gravado | |
|---|---|---|
2.500 | 2.500 | correto |
2,500 | 2.000 | meia unidade perdida, em silêncio |
0,750 | 0.000 | pior caso — quantidade zero faz a linha entrar valendo zero e sumir do faturamento |
2,000 | 2.000 | correto 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.
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:
| Enviado | Gravado | |
|---|---|---|
1234,56 | 1.234,56 | correto — a forma recomendada |
1.234,56 | 1.234,56 | correto — tem vírgula, o ponto vira milhar |
1.234 | 1,23 | mil vezes menor — sem vírgula, o ponto vira decimal |
12.000 | 12,00 | doze reais em vez de doze mil |
A regra segura é uma só: sem separador de milhar, sempre com
as duas casas decimais — 1234,56, 16,00, -0,05.
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:
1.000,
2.500, 0.750. Sem separador de milhar.92,10, 1234,56. O sinal negativo é preservado (troco e repique).| Onde | Formato | Exemplo | Se vier diferente |
|---|---|---|---|
| R01 · data do movimento | AAAAMMDD | 20260817 | Com separador: interrompe a importação. Outra sequência de dígitos: aceita em silêncio, com data errada. |
| R02/R03/R04/R05 · hora | HH:MM | 19:42 | Não validado. Data/hora inválida gravada na venda. |
O campo é interpretado posicionalmente como AAAAMMDD, sem conferência de
faixa. Há dois desfechos, ambos ruins e ambos silenciosos:
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.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.
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.
| Enviado | Interpretado | Situação |
|---|---|---|
1T1800 | 18,00 % | Correto — formato canônico |
1T0700 | 07,00 % | Correto — complete com zero à esquerda |
1T700 | 70,00 % | Errado — sem o zero à esquerda a leitura posicional inverte |
1T12,50 | 12,00 % | Nunca envie — separador é lido como casa decimal; use 1T1250 |
1T18 | 18,00 % | Aceito, mas prefira 1T1800 |
0 | sem alíquota | Aceito quando não há tributação a informar |
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.
A distinção é importante para você calibrar as expectativas da loja:
| Campo do arquivo | Origem | Efeito se não correlacionado |
|---|---|---|
| Produto | R03 campo 6 / R04 campo 6 | Retém o dia inteiro |
| Forma de pagamento | R05 campo 6 | Retém o dia inteiro |
| Operador / vendedor | R02/R03/R04/R05 campo 2 | Não retém — a venda entra |
| Motivo de desconto | R03 campo 14 / R04 campo 13 | Não retém |
| Motivo de cancelamento | R03 campo 10 / R04 campo 9 | Não retém |
| Configuração de Repique | R05 com nome REPIQUE | Não retém — configuração do Next, resolvida uma vez pelo suporte |
FILE AO MOLHO MADEIRA resolve rápido; PROD-4471
não.O que acontece se o mesmo arquivo for enviado duas vezes.
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:
| Situação do envio anterior | O que acontece | Retorno |
|---|---|---|
| Nunca enviado | Processa normalmente. | 1 |
| Enviado, ainda não concluído | Reaproveita. 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 Next | Recusa. Protege contra duplicação de faturamento. | 3 |
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.
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.
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.
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.
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.
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.
GET /webs/api/ — com a barra final — retorna cd_erro 11.http://.POST /venda com o Apiguid correto não retorna cd_erro 2.POST /venda com um dígito alterado, o retorno é cd_erro 2 com HTTP 401.cd_erro, e não por HTTP 200 — e que resposta não-JSON é tratada como falha de transporte.|.0.500.AAAAMMDD.REPIQUE, valor negativo.1 e não soma no faturamento.venda_id aparece na venda correta.Três dias consecutivos de movimento real enviados automaticamente, com fechamento conferido pela loja e nenhuma intervenção manual no período.
Códigos de retorno e vocabulário.
| Código | HTTP | Mensagem | Como tratar |
|---|---|---|---|
| 1 | 200 | Sucesso! | Recebido. Marque como enviado e não reenvie. |
| 2 | 401 | Acesso negado! | Identificador inválido, inativo ou IP não autorizado. Não reenvie: verifique a configuração. |
| 3 | 200 | Arquivo já existe! | Já processado e concluído. Trate como sucesso. |
| 4 | 404 | Rota não encontrada | Rota inexistente. Revise a URL. |
| 5 | 200 | O CNPJ não foi informado! | Campo cnpj ausente ou vazio. |
| 6 | 200 | O nome do arquivo não foi informado! | Campo nm_arquivo ausente ou vazio. |
| 7 | 200 | Arquivo vazio ou não informado! | Campo arquivo ausente ou Base64 vazio. |
| 8 | 200 | Token inválido ou não informado! | Cabeçalho Apiguid ausente. Verifique o nome exato. |
| 9 | 200 | CNPJ 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). |
| 10 | 200 | Não existe local de estoque… | Configuração pendente no Next. Acione o suporte. |
| 11 | 200 | API Disponível! | Resposta do ping. |
| 12 | 200 | Erro ao ler arquivo! | /nfce: XML malformado. |
| 13 | 200 | Estrutura de arquivo inválida… | /nfce: elemento raiz não reconhecido. |
| 14 | 200 | O ID da venda não foi informado! | /nfce: campo venda_id ausente. |
| 15 | 200 | Não foi possivel cadastrar as informações do XML! | Falha ao gravar o documento fiscal. |
| 16 | 200 | Tipo de evento não esperado em tpEvento! | /nfce: tpEvento diferente de 110111. |
| 17 | 200 | Nã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. |
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.
POST /venda com cnpj, nm_arquivo e arquivo em Base64.Apiguid com as chaves { }.cd_erro, nunca pelo status HTTP.cd_erro 1 significa recebido — não reenviar.| nas duas pontas, sem aspas duplas.AAAAMMDD; horas em HH:MM.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.