Introdução
A API do Focus NFe permite que você emita ou consulte documentos fiscais (NFe, NFSe, NFCe) a partir do seu sistema, seja qual for a tecnologia que ele utilize através da geração de dados em um formato simplificado, sem a necessidade de gerar a assinatura digital destes documentos. A API ainda gerencia toda a comunicação com os servidores da SEFAZ de cada estado ou com os servidores da prefeitura, no caso de NFSe.
Através desta documentação deverá ser possível fazer a integração com a API do Focus NFe, caso alguma dúvida permaneça você pode entrar em contato com o suporte especializado através do e-mail suporte@acras.com.br.
Como ler este documento?
Você deverá ler primeiramente a introdução, em seguida, a seção sobre o documento que você irá emitir (NFe, NFCe ou NFSe).
Caso você emita NFe ou NFCe, você deverá ler também sobre os backups.
Caso você emita NFe ou NFSe, você poderá ler também sobre os gatilhos. O uso de gatilhos no sistema é opcional.
Caso você tenha interesse em obter as notas emitidas contra a sua empresa, leia a seção de manifestação.
Se sua empresa irá administrar vários clientes que emitem notas, pode ser interessante você ler sobre a seção de revenda.
Qual documento fiscal você precisa emitir?
Dependendo da atividade da sua empresa você deverá emitir um ou mais destes documentos que irão representar frente ao governo qualquer operação com mercadoria ou serviços:
- NFe - Nota Fiscal Eletrônica. Utilizado para indústrias, distribuidores em geral ou empresas que vendem para clientes fora de seu estado. Neste caso é aceitável uma nota demorar vários minutos para ser autorizada. Existe um padrão nacional. O documento é de competência do estado.
- NFCe - Nota Fiscal ao Consumidor Eletrônica. Utilizado para empresas de varejo, que trabalham diretamente com o consumidor final. Neste caso há a preocupação da nota ser emitida em poucos segundos. Existe um padrão nacional. O documento é de competência do estado.
- NFSe - Nota Fiscal de Serviços Eletrônica. Utilizado para a maioria dos prestadores de serviços. É aceitável a nota demorar vários minutos para ser autorizada. Esta nota é de competência da prefeitura. Existe uma recomendação nacional que cada prefeitura implementa como bem entender.
- CTe - Conhecimento de Transporte Eletrônico. Usado para prestadores de serviços de transporte. Existe um padrão nacional. Documento de competência do estado.
Existe algumas exceções no país, por exemplo Brasília pode utilizar NFe para serviços e Manaus utiliza NFCe em alguns casos para notas de serviços. Na dúvida, consulte o contador da sua empresa.
Visão geral do processo de emissão de um documento
A emissão de NFe e NFSe são processadas de forma assíncrona. NFCe é processada de forma síncrona.
A emissão de documentos síncronos (NFCe) é simples:
- Você envia pela API os dados do documento
- A API devolve como resposta da requisição se o documento foi emitido ou não, e qual a mensagem de erro
Já a emissão de documentos de forma assíncrona são feitos da seguinte forma:
- Você envia pela API os dados do documento
- A API faz uma primeira validação do formato dos dados. Se houver alguma inconsistência, é devolvida uma mensagem de erro. Se estiver tudo ok, o documento é aceito para processamento posterior. Ou seja, ele vai para uma fila onde será eventualmente processado.
- Sua aplicação irá fazer uma nova consulta para verificar o status do processamento
- Nossa API irá informar se o documento ainda está sendo processado, ou se o processamento já finalizou. Neste último caso informa a mensagem de erro ou os dados do documento gerado caso a nota tenha sido autorizada.
- Caso o documento ainda esteja em processamento, sua aplicação deverá agendar uma nova consulta dentro de alguns segundos.
Alternativamente, você poderá usar o conceito de gatilhos. Neste caso você informa a API qual endereço de sua aplicação deverá ser chamado quando uma nota for autorizada. Neste caso funcionaria assim:
- Você envia pela API os dados do documento
- A API faz uma primeira validação do formato dos dados. Informa sobre inconsistência ou avisa que a nota foi aceita para processamento, como no cenário anterior.
- Quando a nota for processada, a API irá ativamente lhe informar através de um HTTP POST no endereço combinado o resultado do processamento.
Autenticação
A autenticação é feita através de um token. Ao habilitar a API para sua empresa forneceremos uma string secreta e única que será usada para efetuar todas as operações. A autenticação poderá ser feita usando o método HTTP Basic Auth (saiba mais em https://en.wikipedia.org/wiki/Basic_access_authentication) fornecendo o token como nome de usuário e deixando a senha em branco.
Caso não seja possível utilizar método HTTP Basic Auth você pode também enviar sempre o parâmetro “token” informando o seu token de acesso. Porém nós recomendamos o uso de HTTP Basic Auth pois isto aumenta a segurança impedindo a gravação do token em históricos do navegador, logs de acesso, etc.
Referência
A referência é a forma que utilizamos para identificar a sua emissão em nossa API, por isso, ela deve ser única para cada token de acesso que você receba. A referência pode ser alfanumérica, contudo, não são permitidos caracteres especiais. É comum a utilização do identificador da tabela em banco de dados que representa uma nota fiscal no seu sistema.
Uma referência pode ser reutilizada caso ocorra erro na autorização. Mas uma vez que a nota seja autorizada (mesmo que posteriormente cancelada), a referência usada não poderá mais ser usada em outro envio.
Ambiente
A API do Focus NFe oferece dois ambientes para emissão de notas: homologação e produção.
Homologação
O ambiente de homologação serve para envio de notas fiscais com a finalidade de teste. As notas emitidas aqui não possuem validade fiscal/tributária.
Produção
Este é o ambiente com validade fiscal e tributária, pois isso, recomendamos que utilize este ambiente apenas quando for iniciar o processo de envio de notas válidas.
O endereço dos servidores são os seguintes:
Homologação: https://homologacao.focusnfe.com.br
Produção: https://api.focusnfe.com.br
Considerações sobre o uso de SSL
<?php
# Em PHP normalmente é necessária uma configuração adicional.
# Em muitos sites você irá encontrar a solução abaixo,
# para ignorar a validação do certificado:
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
# Porém o correto seria indicar para confiar na unidade certificadora
$ch = curl_init();
curl_setopt($ch, CURLOPT_CAINFO, "/pasta/no/servidor/ca.crt");
?>
Verifique em sua linguagem de programação se é necessário alguma configuração adicional para uso de SSL. Pode ser necessário indicar explicitamente a confiar na autoridade certificadora que emitiu o certificado SSL. Em especial na linguagem Java é necessário adicionar todos os certificados, inclusive de toda cadeia da empresa certificadora.
Para poder baixar os certificados de nosso servidor, você pode executar o seguinte comando em algum console linux:
openssl s_client -showcerts -connect api.focusnfe.com.br:443
Isto irá listar todos os certificados entre "-----BEGIN CERTIFICATE-----
"
e "-----END CERTIFICATE-----
". Apenas salve todos estes certificados em arquivos separados e importe
para a sua ferramenta de armazenamento de certificados. Entre em contato com nosso suporte caso encontre
problemas neste processo.
Padrão REST
A API utiliza o padrão de arquitetura REST https://pt.wikipedia.org/wiki/REST. Neste padrão, são utilizados verbos ou métodos HTTP (GET, POST, DELETE) em conjunto com determinados recursos disponíveis através de uma URL para representar uma determinada ação. Por exemplo, o verbo GET é usado para representar algum tipo de visualização dos dados de um dado recurso, e o verbo POST é usado para criar um novo recurso e o verbo DELETE representa uma exclusão.
Abaixo alguns exemplos de requisições:
Método | URL (recurso) | Ação |
---|---|---|
POST | /v2/nfe?ref=REFERENCIA | Cria uma nota fiscal e a envia para processamento. |
GET | /v2/nfe/REFERENCIA | Consulta a nota fiscal com a referência informada e o seu status de processamento |
DELETE | /v2/nfe/REFERENCIA | Cancela uma nota fiscal com a referência informada |
A API utiliza o formato JSON para transferência de dados.
Sempre que é feita uma chamada HTTP é devolvido um código de retorno. Este código irá informar também se a requisição foi aceita ou se ocorreu algum erro, da seguinte forma:
- Códigos que iniciam com “2” representam ação que foi completada com sucesso, por exemplo: 200, 201.
- Códigos que inicial com “4” ou "5" representam algum erro na requisição, por exemplo: 404, 402, etc.
Abaixo listamos os códigos HTTP que nossa API pode devolver:
Código HTTP | Significado | Explicação |
---|---|---|
200 | Ok | Este código é devolvido quando uma consulta resulta em sucesso. |
201 | Criado | Este código é devolvido quando uma requisição é aceita para processamento. |
400 | Requisição inválida | Este erro é devolvido quando falta alguma informação na requisição ou ela é inválida por algum outro motivo. Por exemplo quando falta algum parâmetro obrigatório. |
403 | Permissão negada | Este erro é devolvido quando ocorre algum problema de permissão envolvendo o token de acesso. |
404 | Não encontrado | Este erro é devolvido quando não é encontrado algum recurso que é pesquisado. |
415 | Mídia inválida | Este erro é devolvido quando não é reconhecido o formato JSON enviado, devido a alguma falha de sintaxe. |
422 | Entidade improcessável | Não existe erro na requisição (sintaxe), porém há algum erro de semântica (por exemplo, tentar cancelar uma nota já cancelada) |
429 | Muitas requisições | Você ultrapassou o limite de requisições por minuto. Veja o limite de requisições |
500 | Erro interno do servidor | Ocorreu algum erro inesperado. Contate o suporte técnico. |
Note que se o código HTTP devolvido for de sucesso não implica que uma nota tenha sido autorizada com sucesso. Por exemplo, você pode enviar uma nota fiscal para autorização, nossa API devolver o status 201 (criado) (pois não havia nenhum erro aparente na nota fiscal) porém ao ser processada pela SEFAZ ou prefeitura verificou-se que a data de emissão estava muito atrasada. Ou seja, os códigos HTTP são utilizados para verificar se a transação está ok no nível de comunicação da sua aplicação com a nossa API (e não com o SEFAZ).
Erros
Exemplo de mensagem de erro
{
"codigo": "nao_encontrado",
"mensagem": "Nota fiscal não encontrada"
}
As mensagens de erro serão apresentadas em qualquer operação sempre que for devolvido um código HTTP que começa com 4. A mensagem será um objeto com os seguintes atributos:
- codigo - O código da mensagem
- mensagem - A descrição mais detalhada do que ocorreu
- erros - (Opcional) Quando for possível detalhar o erro, ele será informado neste array de objetos
Abaixo listamos os códigos de erro mais comuns.
Código HTTP | Código do erro | Significado |
---|---|---|
400 | requisicao_invalida | Faltou informar algum campo na requisição. Este campo é informando na mensagem do erro |
400 | empresa_nao_habilitada | Empresa ainda não habilitada para emitir o documento que você precisa. Habilite no seu painel ou contate o suporte técnico |
400 | nfe_cancelada | Foi feita uma tentativa de cancelar uma nota já cancelada |
403 | permissao_negada | Sua aplicação por algum motivo se encontra bloqueada para uso. Contate o nosso suporte |
404 | nao_encontrado | Ocorre quando o recurso que você está procurando (NFe, NFCe ou NFSe) não é encontrado |
422 | nfe_nao_autorizada | Foi feita alguma operação com a nota que só é aplicável se ela estiver autorizada (por exemplo a ação de cancelamento) |
422 | nfe_autorizada | Foi solicitado o processamento de uma nota já autorizada |
422 | em_processamento | Foi solicitado o processamento de uma nota que já está em processamento |
NFe
Através da API NFe é possível:
- Emitir NFe utilizando dados simplificados. Este processo é assíncrono. Ou seja, após a emissão a nota será enfileirada para processamento.
- Cancelar NFe.
- Consultar o status de NFe emitidas.
- Encaminhar uma NFe por email
- Emitir Carta de Correção.
- Inutilizar uma faixa de numeração de NFe
URLs
Método | URL (recurso) | Ação |
---|---|---|
POST | /v2/nfe?ref=REFERENCIA | Cria uma nota fiscal e a envia para processamento. |
GET | /v2/nfe/REFERENCIA | Consulta a nota fiscal com a referência informada e o seu status de processamento |
DELETE | /v2/nfe/REFERENCIA | Cancela uma nota fiscal com a referência informada |
POST | /v2/nfe/REFERENCIA/carta_correcao | Cria uma carta de correção para a nota fiscal com a referência informada. |
POST | /v2/nfe/REFERENCIA/email | Envia um email com uma cópia da nota fiscal com a referência informada |
POST | /v2/nfe/inutilizacao | Inutiliza uma numeração da nota fiscal |
Campos obrigatórios de uma NFe
Atualmente, a NFe possui centenas de campos para os mais variados tipos e formas de operações, por isso, criamos uma página exclusiva que mostra todos os campos da nossa API para o envio de NFe. Nela, você pode buscar os campos pela TAG XML ou pela nossa tradução para API.
Documentação completa dos campos (versão 4.00 da NFe)
Abaixo, iremos mostrar os campos de uso obrigatório para emissão de uma Nota Fiscal Eletrônica.
Abaixo um exemplo de dados de uma nota (usando a versão 4.00 da NFe):
{
"natureza_operacao":"Remessa",
"data_emissao":"2017-04-15",
"data_entrada_saida":"2017-04-15",
"tipo_documento":1,
"finalidade_emissao":1,
"cnpj_emitente":"SEU_CNPJ",
"cpf_emitente": "SEU_CPF",
"nome_emitente":"Sua Raz\u00e3o Social Ltda",
"nome_fantasia_emitente":"Fantasia do Emitente",
"logradouro_emitente":"Rua Quinze de Abril",
"numero_emitente":999,
"bairro_emitente":"Jd Paulistano",
"municipio_emitente":"S\u00e3o Paulo",
"uf_emitente":"SP",
"cep_emitente":"01454-600",
"inscricao_estadual_emitente":"SUA_INSCRICAO_ESTADUAL",
"nome_destinatario":"NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"cpf_destinatario":"03055054911",
"inscricao_estadual_destinatario":null,
"telefone_destinatario":1196185555,
"logradouro_destinatario":"Rua S\u00e3o Janu\u00e1rio",
"numero_destinatario":99,
"bairro_destinatario":"Crespo",
"municipio_destinatario":"Manaus",
"uf_destinatario":"AM",
"pais_destinatario":"Brasil",
"cep_destinatario":69073178,
"valor_frete":0.0,
"valor_seguro":0,
"valor_total":47.23,
"valor_produtos":47.23,
"modalidade_frete":0,
"items": [
{
"numero_item":1,
"codigo_produto":1232,
"descricao":"Cartu00f5es de Visita",
"cfop":5923,
"unidade_comercial":"un",
"quantidade_comercial":100,
"valor_unitario_comercial":0.4723,
"valor_unitario_tributavel":0.4723,
"unidade_tributavel":"un",
"codigo_ncm":49111090,
"quantidade_tributavel":100,
"valor_bruto":47.23,
"icms_situacao_tributaria":41,
"icms_origem":0,
"pis_situacao_tributaria":"07",
"cofins_situacao_tributaria":"07"
}
]
}
Geral
- natureza_operacao: Descrição da natureza da operação a ser realizada pela nota fiscal.
- data_emissao: Data da emissão da NFe. Formato padrão ISO, exemplo: “2016-12-25T12:00-0300”.
- tipo_documento: Tipo da NFe. Valores possíveis:
0 – Nota Fiscal de Entrada;
1 – Nota Fiscal de Saída.
- local_destino: Local onde a operação irá acontecer. Valores possíveis:
1 – Operação interna;
2 – Operação interestadual;
3 – Operação com exterior.
- finalidade_emissao: Indicar qual a finalidade da emissão da nota. Valores possíveis:
1 – Normal;
2 – Complementar;
3 – Nota de ajuste;
4 – Devolução.
- consumidor_final: Indicar se a operação é com consumidor final. Valores possíveis:
0 – Normal;
1 – Consumidor final.
- presenca_comprador: Informar como foi a presença do comprador. Valores possíveis:
0 – Não se aplica (por exemplo, para a Nota Fiscal complementar ou de ajuste);
1 – Operação presencial;
2 – Operação não presencial, pela Internet;
3 – Operação não presencial, Teleatendimento;
4 – NFC-e em operação com entrega em domicílio;
9 – Operação não presencial, outros.
Emitente
- cnpj_emitente: CNPJ do emitente da nota. Deve ser usado esse campo ou o "cpf_emitente".
- cpf_emitente: CPF do emitente da nota. Deve ser usado esse campo ou o "cnpj_emitente".
- inscricao_estadual_emitente: Informar a Inscrição Estadual do emitente.
- logradouro_emitente: Logradouro do emitente.
- numero_emitente: Número do logradouro do emitente.
- bairro_emitente: Bairro do emitente.
- municipio_emitente: Município do emitente.
- uf_emitente: UF do emitente.
- regime_tributario_emitente: Informar qual o regime tributário do emitente. Valores possíveis:
1 – Simples Nacional;
2 – Simples Nacional – excesso de sublimite de receita bruta;
3 – Regime Normal.
Destinatário
- nome_destinatario: Nome completo do destinatário.
- cnpj_destinatario: CNPJ da empresa destinatária.
- cpf_destinatario: CPF do destinatário. Caso utilize este campo, não enviar o campo “cnpf_destinatario”.
- inscricao_estadual_destinatario: Informar a Inscrição Estadual do destinatário.
- logradouro_destinatario: Logradouro do destinatário.
- numero_destinatario: Número do logradouro do destinatário.
- bairro_destinatario: Bairro do destinatário.
- municipio_destinatario: Município do destinatário.
- uf_destinatario: UF do destinatário.
- indicador_inscricao_estadual_destinatario: Indicador da Inscrição Estadual do destinatário. Valores possíveis:
1 – Contribuinte ICMS (informar a IE do destinatário);
2 – Contribuinte isento de Inscrição no cadastro de Contribuintes do ICMS;
9 – Não Contribuinte, que pode ou não possuir Inscrição Estadual no Cadastro de Contribuintes do ICMS.
Itens
Uma NFe irá conter um ou mais itens no campo “items” que poderão conter os campos abaixo:
- numero_item: Numeração que indica qual a posição do item na nota, deve ser usado numeração sequencial a partir do número “1”.
- codigo_produto: Código do produto.
- descricao: Descrição do produto.
- cfop: Código Fiscal da Operação, CFOP da operação válido para NFe.
- quantidade_comercial: Quantidade da mercadoria.
- quantidade_tributavel: Quantidade tributavel da mercadoria. Caso não se aplique, utilize o mesmo valor do campo quantidade_comercial.
- valor_unitario_comercial: Valor unitário da mercadoria.
- valor_unitario_tributavel: Valor unitário tributável da mercadoria. Caso não se aplique, utilize o mesmo valor do campo valor_unitario_comercial.
- unidade_comercial: Unidade comercial do produto. Você pode utilizar valores como “KG”, “L”, “UN” entre outros. * Caso não se aplique, use “UN”.
- unidade_tributavel: Unidade tributável do produto. Caso não se aplique, utilize o mesmo valor do campo unidade_comercial.
- valor_bruto: Valor bruto do produto.
- código_ncm: Código NCM do produto. Este código possui 8 dígitos.
- inclui_no_total: Valor do item (valor_bruto) compõe valor total da NFe (valor_produtos)?. Valores possíveis:
0 – Não;
1 – Sim.
- icms_origem: Informar a origem do ICMS. Valores possíveis:
0 – Nacional;
1 – Estrangeira (importação direta);
2 – Estrangeira (adquirida no mercado interno);
3 – Nacional com mais de 40% de conteúdo estrangeiro;
4 – Nacional produzida através de processos produtivos básicos;
5 – Nacional com menos de 40% de conteúdo estrangeiro;
6 – Estrangeira (importação direta) sem produto nacional similar;
7 – Estrangeira (adquirida no mercado interno) sem produto nacional similar;
- icms_situacao_tributaria: Informar qual a situação do ICMS para a operação. Valores possíveis:
00 – Tributada integralmente;
10 – Tributada e com cobrança do ICMS por substituição tributária;
20 – Tributada com redução de base de cálculo;
30 – Isenta ou não tributada e com cobrança do ICMS por substituição tributária;
40 – Isenta;
41 – Não tributada;
50 – Suspensão;
51 – Diferimento (a exigência do preenchimento das informações do ICMS diferido fica a critério de cada UF);
60 – Cobrado anteriormente por substituição tributária;
70 – Tributada com redução de base de cálculo e com cobrança do ICMS por substituição tributária; 90 – Outras (regime Normal);
101 – Ttributada pelo Simples Nacional com permissão de crédito;
102 – Tributada pelo Simples Nacional sem permissão de crédito;
103 – Isenção do ICMS no Simples Nacional para faixa de receita bruta;
201 – Tributada pelo Simples Nacional com permissão de crédito e com cobrança do ICMS por substituição tributária;
202 – Tributada pelo Simples Nacional sem permissão de crédito e com cobrança do ICMS por substituição tributária;
203 – Isenção do ICMS nos Simples Nacional para faixa de receita bruta e com cobrança do ICMS por substituição tributária;
300 – Imune;
400 – Não tributada pelo Simples Nacional;
500 – ICMS cobrado anteriormente por substituição tributária (substituído) ou por antecipação;
900 – Outras (regime Simples Nacional);
pis_situacao_tributaria: Informar qual a situação do PIS para a operação. Valores possíveis: 01 – Operação tributável: base de cálculo = valor da operação (alíquota normal – cumulativo/não cumulativo);
02 – Operação tributável: base de cálculo = valor da operação (alíquota diferenciada);
03 – Operação tributável: base de cálculo = quantidade vendida × alíquota por unidade de produto;
04 – Operação tributável: tributação monofásica (alíquota zero);
05 – Operação tributável: substituição tributária;
06 – Operação tributável: alíquota zero;
07 – Operação isenta da contribuição;
08 – Operação sem incidência da contribuição;
09 – Operação com suspensão da contribuição;
49 – Outras operações de saída;
50 – Operação com direito a crédito: vinculada exclusivamente a receita tributada no mercado interno;
51 – Operação com direito a crédito: vinculada exclusivamente a receita não tributada no mercado interno;
52 – Operação com direito a crédito: vinculada exclusivamente a receita de exportação;
53 – Operação com direito a crédito: vinculada a receitas tributadas e não-tributadas no mercado interno;
54 – Operação com direito a crédito: vinculada a receitas tributadas no mercado interno e de exportação;
55 – Operação com direito a crédito: vinculada a receitas não-tributadas no mercado interno e de exprtação;
56 – Operação com direito a crédito: vinculada a receitas tributadas e não-tributadas no mercado interno e de exportação;
60 – Crédito presumido: operação de aquisição vinculada exclusivamente a receita tributada no mercado interno;
61 – Crédito presumido: operação de aquisição vinculada exclusivamente a receita não-tributada no mercado interno;
62 – Crédito presumido: operação de aquisição vinculada exclusivamente a receita de exportação;
63 – Crédito presumido: operação de aquisição vinculada a receitas tributadas e não-tributadas no mercado interno;
64 – Crédito presumido: operação de aquisição vinculada a receitas tributadas no mercado interno e de exportação;
65 – Crédito presumido: operação de aquisição vinculada a receitas não-tributadas no mercado interno e de exportação;
66 – Crédito presumido: operação de aquisição vinculada a receitas tributadas e não-tributadas no mercado interno e de exportação;
67 – Crédito presumido: outras operações;
70 – Operação de aquisição sem direito a crédito;
71 – Operação de aquisição com isenção;
72 – Operação de aquisição com suspensão;
73 – Operação de aquisição a alíquota zero;
74 – Operação de aquisição sem incidência da contribuição;
75 – Operação de aquisição por substituição tributária;
98 – Outras operações de entrada;
99 – Outras operações;
- cofins_situacao_tributaria: Informar qual a situação do CONFINS para a operação. Valores possíveis:
01 – Operação tributável: base de cálculo = valor da operação (alíquota normal – cumulativo/não cumulativo);
02 – Operação tributável: base de cálculo = valor da operação (alíquota diferenciada);
03 – Operação tributável: base de cálculo = quantidade vendida × alíquota por unidade de produto;
04 – Operação tributável: tributação monofásica (alíquota zero);
05 – Operação tributável: substituição tributária;
06 – Operação tributável: alíquota zero;
07 – Operação isenta da contribuição;
08 – Operação sem incidência da contribuição;
09 – Operação com suspensão da contribuição;
49 – Outras operações de saída;
50 – Operação com direito a crédito: vinculada exclusivamente a receita tributada no mercado interno;
51 – Operação com direito a crédito: vinculada exclusivamente a receita não tributada no mercado
interno;
52 – Operação com direito a crédito: vinculada exclusivamente a receita de exportação;
53 – Operação com direito a crédito: vinculada a receitas tributadas e não-tributadas no mercado interno;
54 – Operação com direito a crédito: vinculada a receitas tributadas no mercado interno e de exportação;
55 – Operação com direito a crédito: vinculada a receitas não-tributadas no mercado interno e de exportação;
56 – Operação com direito a crédito: vinculada a receitas tributadas e não-tributadas no mercado interno e de exportação;
60 – Crédito presumido: operação de aquisição vinculada exclusivamente a receita tributada no mercado interno;
61 – Crédito presumido: operação de aquisição vinculada exclusivamente a receita não-tributada no mercado interno;
62 – Crédito presumido: operação de aquisição vinculada exclusivamente a receita de exportação;
63 – Crédito presumido: operação de aquisição vinculada a receitas tributadas e não-tributadas no mercado interno;
64 – Crédito presumido: operação de aquisição vinculada a receitas tributadas no mercado interno e de exportação;
65 – Crédito presumido: operação de aquisição vinculada a receitas não-tributadas no mercado interno e de exportação;
66 – Crédito presumido: operação de aquisição vinculada a receitas tributadas e não-tributadas no mercado interno e de exportação;
67 – Crédito presumido: outras operações;
70 – Operação de aquisição sem direito a crédito;
71 – Operação de aquisição com isenção;
72 – Operação de aquisição com suspensão;
73 – Operação de aquisição a alíquota zero;
74 – Operação de aquisição sem incidência da contribuição;
75 – Operação de aquisição por substituição tributária;
98 – Outras operações de entrada;
99 – Outras operações;
- icms_base_calculo: Valor total da base de cálculo do ICMS. Assume zero se não informado.
- icms_valor_total: Valor total do ICMS. Assume zero se não informado.
- icms_base_calculo_st: Valor total da base de cálculo do ICMS do substituto tributário. Assume zero se não informado.
- icms_valor_total_st: Valor total do ICMS do substituto tributário. Assume zero se não informado.
- valor_produtos: Valor total dos produtos. Assume zero se não informado.
- valor_frete: Valor total do frete. Assume zero se não informado.
- valor_seguro: Valor total do seguro. Assume zero se não informado.
- valor_desconto: Valor total do desconto. Assume zero se não informado.
- valor_ipi: Valor total do IPI. Assume zero se não informado.
- valor_pis: Valor do PIS. Assume zero se não informado.
- valor_cofins: Valor do COFINS. Assume zero se não informado.
- valor_outras_despesas: Valor das despesas acessórias. Assume zero se não informado.
- valor_total: Valor total da nota fiscal.
- modalidade_frete: Indica a modalidade do frete da operação. Valores possíveis:
0 – Por conta do emitente;
1 – Por conta do destinatário;
2 – Por conta de terceiros;
9 – Sem frete;
Campos calculados automaticamente
Para simplificar o envio da nota fiscal, alguns campos são calculados automaticamente a partir da versão 4.00 da NFe. Os campos calculados são somatórios de campos fornecidos nos itens da nota fiscal. Os campos serão calculados apenas se eles não forem informados na API.
A lista de campos calculados automaticamente segue abaixo:
Campo | Somatório de campo dos itens | Observação |
---|---|---|
icms_base_calculo | icms_base_calculo | |
valor_ipi | ipi_valor | |
icms_valor_total_st | icms_valor_st | |
issqn_base_calculo | issqn_base_calculo | |
issqn_valor_total | issqn_valor | |
issqn_valor_total_deducao | issqn_valor_deducao | |
issqn_valor_total_outras_retencoes | issqn_valor_outras_retencoes | |
issqn_valor_total_desconto_incondicionado | issqn_valor_desconto_incondicionado | |
issqn_valor_total_desconto_condicionado | issqn_valor_desconto_condicionado | |
issqn_valor_total_retencao | issqn_valor_retencao | |
issqn_base_calculo | issqn_base_calculo | |
valor_total_ii | ii_valor | |
fcp_valor_total | fcp_valor | |
fcp_valor_total_uf_destino | fcp_valor_uf_destino | |
fcp_valor_total_st | fcp_valor_st | |
fcp_valor_total_retido_st | fcp_valor_retido_st | |
icms_valor_total_uf_destino | icms_valor_uf_destino | |
icms_valor_total_uf_remetente | icms_valor_uf_remetente | |
icms_base_calculo | icms_base_calculo | |
icms_valor_total | icms_valor | |
icms_valor_total_desonerado | icms_valor_desonerado | |
icms_base_calculo_st | icms_base_calculo_st | |
icms_valor_total_st | icms_valor_st | |
valor_frete | valor_frete | |
valor_seguro | valor_seguro | |
valor_outras_despesas | valor_outras_despesas | |
valor_desconto | valor_desconto | |
valor_ipi_devolvido | valor_ipi_devolvido | |
valor_total_tributos | valor_total_tributos | |
valor_produtos | valor_bruto | Apenas se inclui_no_total=1 |
valor_total_servicos | valor_bruto | Apenas se inclui_no_total=1 e item de serviço |
icms_valor_total | icms_valor | Apenas se icms_situacao_tributaria diferente de40, 41 e 50. |
valor_pis_servicos | pis_valor | Apenas se item de serviço |
valor_cofins_servicos | cofins_valor | Apenas se item de serviço |
valor_pis | pis_valor | Apenas se não for item de serviço |
valor_cofins | cofins_valor | Apenas se não for item de serviço |
Status API
Aqui você encontra os status possíveis para NFe.
HTTP CODE/STATUS | Status API Focus | Descrição | Correção |
---|---|---|---|
422 - unprocessable entity | erro_validacao_schema | Erro na validação do Schema XML. | Verifique o detalhamento do erro na resposta da API. |
422 - unprocessable entity | nfe_nao_autorizada | Nota fiscal não autorizada. | O cancelamento só é possível para NFe's autorizadas. |
404 - not found | nao_encontrado | Utilize o método POST. | O método de envio usado é diferente de POST, por favor, use o HTTP POST. |
404 - not found | nao_encontrado | Nota fiscal não encontrada. | Verifique se a nota a ser cancelada realmente existe antes de enviar o cancelamento. |
400 - bad request | requisicao_invalida | Parâmetro "justificativa" não informado. | Você precisa usar o parâmetro 'justificativa'. Consulte a nossa documentação. |
400 - bad request | requisicao_invalida | Parâmetro "justificativa" deve ter entre 15 e 255 caracteres. | A sua justificativa não possui de 15 à 255 careacteres. |
400 - bad request | requisicao_invalida | Parâmetro X não informado. | Onde X é o campo que não foi informado em sua requisição. |
400 - bad request | requisicao_invalida | Não existe série com os critérios informados. | Os critérios de inutilização não existem. Verifique a nossa documentação. |
400 - bad request | requisicao_invalida | CNPJ do emitente não autorizado ou não informado. | Verifique o campo "cnpj_emitente" em seu JSON. É preciso habilitar a emissão de NFe no cadastro do emitente(Painel API). |
400 - bad request | requisicao_invalida | CNPJ/UF do emitente não autorizado ou não informado. | Verifique os campos "cnpj_emitente" e "uf_emitente". É preciso habilitar a emissão de NFe no cadastro do emitente(Painel API). |
403 - forbidden | permissao_negada | CNPJ do emitente não autorizado. | O emitente utilizado não está autorizado a emitir NFe ou foi informado o CNPJ do emitente incorretamente no JSON. |
Envio
# arquivo.json deve conter os dados da NFe, substitua REFERENCIA pela referência de sua escolha
curl -u "token obtido no cadastro da empresa:" \
-X POST -T arquivo.json https://homologacao.focusnfe.com.br/v2/nfe?ref=REFERENCIA
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$nfe = array (
"natureza_operacao" => "Remessa",
"data_emissao" => "2017-11-30T12:00:00",
"data_entrada_saida" => "2017-11-3012:00:00",
"tipo_documento" => "1",
"finalidade_emissao" => "1",
"cnpj_emitente" => "51916585000125",
"nome_emitente" => "ACME LTDA",
"nome_fantasia_emitente" => "ACME LTDA",
"logradouro_emitente" => "R. Padre Natal Pigato",
"numero_emitente" => "100",
"bairro_emitente" => "Santa Felicidade",
"municipio_emitente" => "Curitiba",
"uf_emitente" => "PR",
"cep_emitente" => "82320030",
"inscricao_estadual_emitente" => "101942171617",
"nome_destinatario" => "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"cpf_destinatario" => "51966818092",
"telefone_destinatario" => "1196185555",
"logradouro_destinatario" => "Rua S\u00e3o Janu\u00e1rio",
"numero_destinatario" => "99",
"bairro_destinatario" => "Crespo",
"municipio_destinatario" => "Manaus",
"uf_destinatario" => "AM",
"pais_destinatario" => "Brasil",
"cep_destinatario" => "69073178",
"valor_frete" => "0.0",
"valor_seguro" => "0",
"valor_total" => "47.23",
"valor_produtos" => "47.23",
"modalidade_frete" => "0",
"items" => array(
array(
"numero_item" => "1",
"codigo_produto" => "1232",
"descricao" => "Cartu00f5es de Visita",
"cfop" => "6923",
"unidade_comercial" => "un",
"quantidade_comercial" => "100",
"valor_unitario_comercial" => "0.4723",
"valor_unitario_tributavel" => "0.4723",
"unidade_tributavel" => "un",
"codigo_ncm" => "49111090",
"quantidade_tributavel" => "100",
"valor_bruto" => "47.23",
"icms_situacao_tributaria" => "400",
"icms_origem" => "0",
"pis_situacao_tributaria" => "07",
"cofins_situacao_tributaria" => "07"
)
),
);
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfe?ref=" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($nfe));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
import java.util.HashMap;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFeAutorizar {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfe?ref="+ref);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
/* Aqui são criados as hash's que receberão os dados da nota. */
HashMap<String, String> nfe = new HashMap<String, String>();
HashMap<String, String> itens = new HashMap<String, String>();
nfe.put("data_emissao", "2018-01-16T09:38:00");
nfe.put("natureza_operacao", "Remessa de Produtos");
nfe.put("forma_pagamento", "0");
nfe.put("tipo_documento", "1");
nfe.put("finalidade_emissao", "1");
nfe.put("cnpj_emitente", "51916585000125");
nfe.put("nome_emitente", "ACME LTDA");
nfe.put("nome_fantasia_emitente", "ACME TESTES");
nfe.put("logradouro_emitente", "Rua Interventor Manoel Ribas");
nfe.put("numero_emitente", "1355 ");
nfe.put("bairro_emitente", "Santa Felicidade");
nfe.put("municipio_emitente", "Curitiba");
nfe.put("uf_emitente", "PR");
nfe.put("cep_emitente", "82320030");
nfe.put("telefone_emitente", "44912345678");
nfe.put("inscricao_estadual_emitente", "1234567");
nfe.put("nome_destinatario", "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL");
nfe.put("cpf_destinatario", "51966818092");
nfe.put("inscricao_estadual_destinatario", "ISENTO");
nfe.put("telefone_destinatario", "19912345678");
nfe.put("logradouro_destinatario", "Rua Leonor Campos");
nfe.put("numero_destinatario", "29");
nfe.put("bairro_destinatario", "Swiss Park");
nfe.put("municipio_destinatario", "Campinas");
nfe.put("uf_destinatario", "SP");
nfe.put("pais_destinatario", "Brasil");
nfe.put("cep_destinatario", "13049555");
nfe.put("icms_base_calculo", "0");
nfe.put("icms_valor_total", "0");
nfe.put("icms_base_calculo_st", "0");
nfe.put("icms_valor_total_st", "0");
nfe.put("icms_modalidade_base_calculo", "0");
nfe.put("icms_valor", "0");
nfe.put("valor_frete", "0");
nfe.put("valor_seguro", "0");
nfe.put("valor_total", "1");
nfe.put("valor_produtos", "1");
nfe.put("valor_desconto", "0.00");
nfe.put("valor_ipi", "0");
nfe.put("modalidade_frete", "1");
itens.put("numero_item","128");
itens.put("codigo_produto","1007");
itens.put("descricao","Multi Mist 500g");
itens.put("cfop","6102");
itens.put("unidade_comercial","un");
itens.put("quantidade_comercial","1");
itens.put("valor_unitario_comercial","1");
itens.put("valor_unitario_tributavel","1");
itens.put("unidade_tributavel","un");
itens.put("codigo_ncm","11041900");
itens.put("valor_frete","0");
itens.put("valor_desconto","0.00");
itens.put("quantidade_tributavel","1");
itens.put("valor_bruto","1");
itens.put("icms_situacao_tributaria","103");
itens.put("icms_origem","0");
itens.put("pis_situacao_tributaria","07");
itens.put("cofins_situacao_tributaria","07");
itens.put("ipi_situacao_tributaria","53");
itens.put("ipi_codigo_enquadramento_legal","999");
/* Depois de fazer o input dos dados, são criados os objetos JSON já com os valores das hash's. */
JSONObject json = new JSONObject (nfe);
JSONObject jsonItens = new JSONObject (itens);
/* Aqui adicionamos os objetos JSON nos campos da API como array no JSON principal. */
json.append("items", jsonItens);
/* É recomendado verificar como os dados foram gerados em JSON e se ele está seguindo a estrutura especificada em nossa documentação.
System.out.print(json); */
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas a seguir exibem as informações retornadas pela nossa API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfe?ref=" + ref
# altere os campos conforme a nota que será enviada
dados_da_nota = {
natureza_operacao: "Remessa",
data_emissao: "2017-11-30T12:00:00",
data_entrada_saida: "2017-11-3012:00:00",
tipo_documento: "1",
finalidade_emissao: "1",
cnpj_emitente: "51916585000125",
nome_emitente: "ACME LTDA",
nome_fantasia_emitente: "ACME LTDA",
logradouro_emitente: "R. Padre Natal Pigato",
numero_emitente: "100",
bairro_emitente: "Santa Felicidade",
municipio_emitente: "Curitiba",
uf_emitente: "PR",
cep_emitente: "82320030",
inscricao_estadual_emitente: "101942171617",
nome_destinatario: "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
cpf_destinatario: "51966818092",
telefone_destinatario: "1196185555",
logradouro_destinatario: "Rua Sao Januario",
numero_destinatario: "99",
bairro_destinatario: "Crespo",
municipio_destinatario: "Manaus",
uf_destinatario: "AM",
pais_destinatario: "Brasil",
cep_destinatario: "69073178",
valor_frete: "0.0",
valor_seguro: "0",
valor_total: "47.23",
valor_produtos: "47.23",
modalidade_frete: "0",
items: [
numero_item: "1",
codigo_produto: "1232",
descricao: "Cartu00f5es de Visita",
cfop: "6923",
unidade_comercial: "un",
quantidade_comercial: "100",
valor_unitario_comercial: "0.4723",
valor_unitario_tributavel: "0.4723",
unidade_tributavel: "un",
codigo_ncm: "49111090",
quantidade_tributavel: "100",
valor_bruto: "47.23",
icms_situacao_tributaria: "400",
icms_origem: "0",
pis_situacao_tributaria: "07",
cofins_situacao_tributaria: "07"
]
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, "")
# convertemos os dados da nota para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = dados_da_nota.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfe?ref=" + ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var nfe = {
"natureza_operacao": "Remessa",
"data_emissao": "2018-03-21T11:00:00",
"data_entrada_saida": "2018-03-21T11:00:00",
"tipo_documento": "1",
"finalidade_emissao": "1",
"cnpj_emitente": "51916585000125",
"nome_emitente": "ACME LTDA",
"nome_fantasia_emitente": "ACME LTDA",
"logradouro_emitente": "R. Padre Natal Pigato",
"numero_emitente": "100",
"bairro_emitente": "Santa Felicidade",
"municipio_emitente": "Curitiba",
"uf_emitente": "PR",
"cep_emitente": "82320030",
"inscricao_estadual_emitente": "1234567",
"nome_destinatario": "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"cpf_destinatario": "51966818092",
"telefone_destinatario": "1196185555",
"logradouro_destinatario": "Rua S\u00e3o Janu\u00e1rio",
"numero_destinatario": "99",
"bairro_destinatario": "Crespo",
"municipio_destinatario": "Manaus",
"uf_destinatario": "AM",
"pais_destinatario": "Brasil",
"cep_destinatario": "69073178",
"valor_frete": "0.0",
"valor_seguro": "0",
"valor_total": "47.23",
"valor_produtos": "47.23",
"modalidade_frete": "0",
"items": [
{
"numero_item": "1",
"codigo_produto": "1232",
"descricao": "Cartu00f5es de Visita",
"cfop": "6923",
"unidade_comercial": "un",
"quantidade_comercial": "100",
"valor_unitario_comercial": "0.4723",
"valor_unitario_tributavel": "0.4723",
"unidade_tributavel": "un",
"codigo_ncm": "49111090",
"quantidade_tributavel": "100",
"valor_bruto": "47.23",
"icms_situacao_tributaria": "400",
"icms_origem": "0",
"pis_situacao_tributaria": "07",
"cofins_situacao_tributaria": "07"
}
]
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(nfe));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfe"
# Substituir pela sua identificação interna da nota
ref = {"ref":"12345"}
token="token obtido no cadastro da empresa"
'''
Usamos dicionarios para armazenar os campos e valores que em seguida,
serao convertidos em JSON e enviados para nossa API
'''
nfe = {}
itens = {}
notas_referenciadas ={}
nfe["natureza_operacao"] = "Venda"
nfe["forma_pagamento"] = "0"
nfe["data_emissao"] = "2018-03-07T10:20:00-03:00"
nfe["tipo_documento"] = "0"
nfe["local_destino"] = "1"
nfe["finalidade_emissao"] = "4"
nfe["consumidor_final"] = "0"
nfe["presenca_comprador"] = "9"
nfe["cnpj_emitente"] = "99999999999999"
nfe["logradouro_emitente"] = "R. Padre Pigato"
nfe["numero_emitente"] = "9236"
nfe["bairro_emitente"] = "Santa Gula"
nfe["municipio_emitente"] = "Curitiba"
nfe["uf_emitente"] = "PR"
nfe["cep_emitente"] = "82320999"
nfe["telefone_emitente"] = "4199999999"
nfe["inscricao_estadual_emitente"] = "999999999"
nfe["regime_tributario_emitente"] = "1"
nfe["cpf_destinatario"] = "99999999999"
nfe["nome_destinatario"] = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"
nfe["logradouro_destinatario"] = "Rua Prof. Yolanda Romeu Lugarini"
nfe["numero_destinatario"] = "1"
nfe["bairro_destinatario"] = "JD SANTA CECILIA"
nfe["municipio_destinatario"] = "CAMPO MAGRO"
nfe["uf_destinatario"] = "PR"
nfe["cep_destinatario"] = "83000000"
nfe["indicador_inscricao_estadual_destinatario"] = "2"
nfe["icms_base_calculo"] = "0"
nfe["icms_valor_total"] = "0"
nfe["icms_valor_total_desonerado"] = "0"
nfe["icms_base_calculo_st"] = "0"
nfe["icms_valor_total_st"] = "0"
nfe["valor_produtos"] = "1.00"
nfe["valor_frete"] = "0"
nfe["valor_seguro"] = "0"
nfe["valor_desconto"] = "0"
nfe["valor_total_ii"] = "0"
nfe["valor_ipi"] = "0"
nfe["valor_pis"] = "0"
nfe["valor_cofins"] = "0"
nfe["valor_outras_despesas"] = "0"
nfe["valor_total"] = "1.00"
nfe["modalidade_frete"] = "0"
notas_referenciadas["chave_nfe"] = 41170599999999999999550020000001111337477298
itens["numero_item"] = "1"
itens["codigo_produto"] = "ESSP"
itens["descricao"] = "Carrinho de corrida"
itens["cfop"] = "1202"
itens["unidade_comercial"] = "UN"
itens["quantidade_comercial"] = "1.00"
itens["valor_unitario_comercial"] = "1.00"
itens["valor_bruto"] = "1.00"
itens["valor_desconto"] = "0"
itens["unidade_tributavel"] = "UN"
itens["codigo_ncm"] = "49119900"
itens["quantidade_tributavel"] = "1.00"
itens["valor_unitario_tributavel"] = "1.00"
itens["inclui_no_total"] = "1"
itens["icms_origem"] = "0"
itens["icms_situacao_tributaria"] = "103"
itens["pis_situacao_tributaria"] = "99"
itens["cofins_situacao_tributaria"] = "99"
# Adicionamos os dados das variaveis itens e notas_referenciadas como listas ao dicionario principal.
nfe["items"] = [itens]
nfe["notas_referenciadas"] = [notas_referenciadas]
r = requests.post(url, params=ref, data=json.dumps(nfe), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
Para enviar uma NFe utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Envia uma NFe para autorização:
https://api.focusnfe.com.br/v2/nfe?ref=REFERENCIA
Utilize o comando HTTP POST para enviar a sua nota para nossa API. Envie como corpo do POST os dados em formato JSON da nota fiscal.
Nesta etapa, é feita uma primeira validação dos dados da nota. Caso ocorra algum problema, por exemplo, algum campo faltante, formato incorreto ou algum problema com o emitente a nota não será aceita para processamento e será devolvida a mensagem de erro apropriada. Veja a seção erros.
Caso a nota seja validada corretamente, a nota será aceita para processamento. Isto significa que a nota irá para uma fila de processamento onde eventualmente será processada (processamento assíncrono). Com isto, a nota poderá ser autorizada ou ocorrer um erro na autorização, de acordo com a validação da SEFAZ.
Para verificar se a nota já foi autorizada, você terá que efetuar uma consulta ou se utilizar de gatilhos.
Reenvio automático em contingência
Caso nossa equipe de monitoramento detecte que o SEFAZ de algum estado esteja fora do ar as requisições são redirecionadas para o ambiente de contingência da SEFAZ do estado. É natural haver uma demora na SEFAZ em disponibilizar esse ambiente (eles realizam este processo manualmente) porém nossa API irá continuar tentando o reenvio até que seja possível, seja pela emissão normal ou em contingência. Isto é feito de forma transparente aos clientes da API.
Porém, pode ocorrer uma situação em que o SEFAZ do estado fique indisponível no meio do processo de emissão de uma NFe. Neste momento nós não temos como saber se a nota foi autorizada ou não, até que a SEFAZ volte a ficar disponível.
Quando isto ocorre nós não esperamos a SEFAZ do estado voltar e reenviamos assim que possível para o ambiente de contingência, autorizando a nota e evitando a espera para o cliente final. Isto tem como efeito colateral que pode ser que a nota original tenha sido autorizada. Nossa API irá automaticamente detectar esta situação e proceder com o cancelamento da tentativa anterior. Por consequência, será natural haver um “pulo” de numeração percebido pelo cliente final.
O sistema cliente da API pode acompanhar este processo de forma transparente, conforme descrito na seção “Consulta” deste manual.
Exemplos de respostas da API por status para a requisição de envio:
autorizado
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899_nfe",
"status": "autorizado",
"status_sefaz": "100",
"mensagem_sefaz": "Autorizado o uso da NF-e",
"chave_nfe": "NFe41190607504505000132550010000000221923094166",
"numero": "22",
"serie": "1",
"caminho_xml_nota_fiscal": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132550010000000221923094166-nfe.xml",
"caminho_danfe": "/arquivos_development/07504505000132/201906/DANFEs/41190607504505000132550010000000221923094166.pdf"
}
erro_validacao_schema
{
"codigo": "erro_validacao_schema",
"mensagem": "Erro na validação do Schema XML, verifique o detalhamento dos erros",
"erros": [
{
"mensagem": "Preencha pelo menos um documento do destinatário: cnpj_destinatario ou cpf_destinatario",
"campo": null
}
]
}
Consulta
# Faça o download e instalação da biblioteca requests, através do python-pip.
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfe/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
# Use este parametro para obter mais informacoes em suas consultas
completa = "completa=1"
r = requests.get(url+ref, params=completa, auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
https://homologacao.focusnfe.com.br/v2/nfe/12345
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfe/" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFeConsulta {
public static void main(String[] args){
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfe/"+ref+"?completa=1");
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.get(ClientResponse.class);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfe/" + ref
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Get a partir da uri de requisição
requisicao = Net::HTTP::Get.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfe/" + ref + "?completa=1";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('GET', url, false, token);
request.send();
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Exemplo de resposta com o parâmetro opcional, completa, recebendo o valor "1":
{
"requisicao_cancelamento": {
"versao": "1.00",
"id_tag": "ID1101119118017764335300017255003000000025138154946401",
"codigo_orgao": "41",
"ambiente": "2",
"cnpj": "CNPJ_DO_EMITENTE",
"chave_nfe": "91180177643353000172550030000000251381549464",
"data_evento": "2012-01-17T16:00:28-02:00",
"tipo_evento": "110111",
"numero_sequencial_evento": "1",
"versao_evento": "1.00",
"descricao_evento": "Cancelamento",
"protocolo": "141180000026777",
"justificativa": "Informe aqui a sua justificativa para realizar o cancelamento da NFe."
},
"protocolo_cancelamento": {
"versao": "1.00",
"ambiente": "2",
"versao_aplicativo": "PR-v3_8_7",
"codigo_orgao": "41",
"status": "135",
"motivo": "Evento registrado e vinculado a NF-e",
"chave_nfe": "91180177643353000172550030000000251381549464",
"tipo_evento": "110111",
"descricao_evento": "Cancelamento",
"data_evento": "2012-01-17T16:00:31-02:00",
"numero_protocolo": "141180000026777"
},
"requisicao_carta_correcao": {
"versao": "1.00",
"id_tag": "ID1101109118017764335300017255003000000025138154946401",
"codigo_orgao": "41",
"ambiente": "2",
"cnpj": "CNPJ_DO_EMITENTE",
"chave_nfe": "91180177643353000172550030000000251381549464",
"data_evento": "2012-01-17T15:59:34-02:00",
"tipo_evento": "110110",
"numero_sequencial_evento": "1",
"versao_evento": "1.00",
"descricao_evento": "Carta de Correcao",
"correcao": "Informe aqui os campos que foram corrigidos na NFe.",
"condicoes_uso": "A Carta de Correcao e disciplinada pelo paragrafo 1o-A do art. 7o do Convenio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularizacao de erro ocorrido na emissao de documento fiscal, desde que o erro nao esteja relacionado com: I - as variaveis que determinam o valor do imposto tais como: base de calculo, aliquota, diferenca de preco, quantidade, valor da operacao ou da prestacao; II - a correcao de dados cadastrais que implique mudanca do remetente ou do destinatario; III - a data de emissao ou de saida."
},
"protocolo_carta_correcao": {
"versao": "1.00",
"ambiente": "2",
"versao_aplicativo": "PR-v3_8_7",
"codigo_orgao": "41",
"status": "135",
"motivo": "Evento registrado e vinculado a NF-e",
"chave_nfe": "91180177643353000172550030000000251381549464",
"tipo_evento": "110110",
"descricao_evento": "Carta de Correção",
"data_evento": "2012-01-17T15:59:37-02:00",
"numero_protocolo": "141180000026777"
}
}
Exemplos de respostas da API por status para a requisição de consulta:
autorizado
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899_nfe",
"status": "autorizado",
"status_sefaz": "100",
"mensagem_sefaz": "Autorizado o uso da NF-e",
"chave_nfe": "NFe41190607504505000132550010000000221923094166",
"numero": "22",
"serie": "1",
"caminho_xml_nota_fiscal": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132550010000000221923094166-nfe.xml",
"caminho_danfe": "/arquivos_development/07504505000132/201906/DANFEs/41190607504505000132550010000000221923094166.pdf"
}
autorizado (com CCe)
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899_nfe",
"status": "autorizado",
"status_sefaz": "135",
"mensagem_sefaz": "Evento registrado e vinculado a NF-e",
"chave_nfe": "NFe41190607504505000132550010000000221923094166",
"numero": "22",
"serie": "1",
"caminho_xml_nota_fiscal": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132550010000000221923094166-nfe.xml",
"caminho_danfe": "/arquivos_development/07504505000132/201906/DANFEs/41190607504505000132550010000000221923094166.pdf",
"caminho_xml_carta_correcao": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132550010000000221923094166-cce-01.xml",
"caminho_pdf_carta_correcao": "/notas_fiscais/NFe41190607504505000132550010000000221923094166/cartas_correcao/1.pdf",
"numero_carta_correcao": 1
}
processando_autorizacao
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899_nfe",
"status": "processando_autorizacao"
}
erro_autorizacao
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899_nfe",
"status": "erro_autorizacao",
"status_sefaz": "598",
"mensagem_sefaz": "NF-e emitida em ambiente de homologacao com Razao Social do destinatario diferente de NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"
}
cancelado
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899_nfe",
"status": "cancelado",
"status_sefaz": "135",
"mensagem_sefaz": "Evento registrado e vinculado a NF-e",
"numero": "22",
"serie": "1",
"chave_nfe": "NFe41190607504505000132550010000000221923094166",
"caminho_xml_nota_fiscal": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132550010000000221923094166-nfe.xml",
"caminho_xml_cancelamento": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132550010000000221923094166-can.xml",
"caminho_xml_carta_correcao": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132550010000000221923094166-cce-02.xml",
"caminho_pdf_carta_correcao": "/notas_fiscais/NFe41190607504505000132550010000000221923094166/cartas_correcao/2.pdf",
"numero_carta_correcao": 2
}
Após emitir uma nota, você poderá usar a operação de consulta para verificar se a nota já foi aceita para processamento, se está ainda em processamento ou se a nota já foi processada.
Para consultar uma NFe utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Consultar as informações de uma NFe:
https://api.focusnfe.com.br/v2/nfe/REFERENCIA?completa=(0|1)
Utilize o comando HTTP GET para consultar a sua nota para nossa API.
Parâmetro Opcional | Ação |
---|---|
completa = 0 ou 1 | Habilita a API há mostrar campos adicionais na requisição de consulta. |
Campos de retorno:
- status: A situação da NFe, podendo ser:
- processando_autorizacao: A nota ainda está em processamento pela API. Você deverá aguardar o processamento pela SEFAZ.
- autorizado: A nota foi autorizada, neste caso é fornecido os dados completos da nota como chave e arquivos para download
- cancelado: O documento foi cancelado, neste caso é fornecido o caminho para download do XML de cancelamento (caminho_xml_cancelamento).
- erro_autorizacao: Houve um erro de autorização por parte da SEFAZ. A mensagem de erro você encontrará nos campos status_sefaz e mensagem_sefaz. É possível fazer o reenvio da nota com a mesma referência se ela estiver neste estado.
- denegado: O documento foi denegado. Uma SEFAZ pode denegar uma nota se houver algum erro cadastral nos dados do destinatário ou do emitente. A mensagem de erro você encontrará nos campos status_sefaz e mensagem_sefaz. Não é possível reenviar a nota caso este estado seja alcançado pois é gerado um número, série, chave de NFe e XML para esta nota. O XML deverá ser armazenado pelo mesmo período de uma nota autorizada ou cancelada.
- status_sefaz: O status da nota na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- serie: A série da nota fiscal, caso ela tenha sido autorizada.
- numero: O número da nota fiscal, caso ela tenha sido autorizada.
- cnpj_emitente: O CNPJ emitente da nota fiscal (o CNPJ de sua empresa).
- ref:A referência da emissão.
- chave_nfe: A chave da NFe, caso ela tenha sido autorizada.
- caminho_xml_nota_fiscal: caso a nota tenha sido autorizada, retorna o caminho para download do XML.
- caminho_danfe: caso a nota tenha sido autorizada retorna o caminho para download do DANFe.
- caminho_xml_carta_correcao: caso tenha sido emitida alguma carta de correção, aqui aparecerá o caminho para fazer o download do XML.
- caminho_pdf_carta_correcao: caso tenha sido emitida alguma carta de correção, aqui aparecerá o caminho para fazer o download do PDF da carta.
- numero_carta_correcao: o número da carta de correção, caso tenha sido emitida.
- caminho_xml_cancelamento: Caso a nota esteja cancelada, é fornecido o caminho para fazer o download do XML de cancelamento.
Caso na requisição seja passado o parâmetro completa=1
será adicionado mais 6 campos:
- requisicao_nota_fiscal: Inclui os dados completos da requisição da nota fiscal, da mesma forma que constam no XML da nota.
- protocolo_nota_fiscal: Inclui os dados completos do protocolo devolvido pela SEFAZ.
- requisicao_cancelamento: Inclui os dados completos da requisição de cancelamento da nota fiscal.
- protocolo_cancelamento: Inclui os dados completos do protocolo devolvido pela SEFAZ.
- requisicao_carta_correcao: Inclui os dados completos da requisição de Carta de Correção Eletrônica da NFe.
- protocolo_carta_correcao: Inclui os dados completos do protocolo devolvido pela SEFAZ.
Reenvio Automático em Contingência – algumas considerações
Quando houver uma tentativa anterior de emissão, conforme descrito na seção “Reenvio automático em contingência”. A API irá devolver a chave tentativa_anterior
que irá conter os seguintes campos:
- status: autorizado, processando_autorizacao ou cancelado. A API irá automaticamente proceder com o cancelamento quando necessário
- serie
- numero
- chave_nfe
- caminho_xml_nota_fiscal
- caminho_xml_cancelamento
Download do XML da NFe
Após a autorização da nota fiscal eletrônica será disponibilizado os campos:
caminho_xml_nota_fiscal - Representa o caminho para montar a URL para download do XML. Por exemplo, se você utilizou o ambiente de produção (https://api.focusnfe.com.br) e o caminho_xml_nota_fiscal contém o caminho "/arquivos_development/77623353000000/201201/XMLs/91180177643353000172550030000000251381549464-nfe.xml" você poderá acessar o XML pela URL completa https://api.focusnfe.com.br/arquivos_development/77623353000000/201201/XMLs/91180177643353000172550030000000251381549464-nfe.xml
Utilize o método HTTP GET para essa consulta.
Existe obrigatoriedade legal para armazenar o XML de todas as notas NFe (modelo 55) por pelo menos 5 anos após a data de autorização da nota. Nossa API faz a guarda automática dos arquivos por esse período.
Cancelamento
curl -u "token obtido no cadastro da empresa:" \
-X DELETE -d '{"justificativa":"Teste de cancelamento de nota"}' \
https://homologacao.focusnfe.com.br/v2/nfe/12345
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$justificativa = array ("justificativa" => "Teste de cancelamento de nota");
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server . "/v2/nfe/" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($justificativa));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
import java.util.HashMap;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFeCancelamento {
public static void main(String[] args){
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfe/"+ref);
/* Aqui criamos um hashmap para receber a chave "justificativa" e o valor desejado. */
HashMap<String, String> justificativa = new HashMap<String, String>();
justificativa.put("justificativa", "Informe aqui a sua justificativa para realizar o cancelamento da NFe.");
/* Criamos um objeto JSON para receber a hash com os dados esperado pela API. */
JSONObject json = new JSONObject(justificativa);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.delete(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfe/" + ref
# altere os campos conforme a nota que será enviada
justificativa_cancelamento = {
justificativa: "Informe aqui a sua justificativa para realizar o cancelamento da NFe."
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Delete a partir da uri de requisição
requisicao = Net::HTTP::Delete.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos a hash de justificativa do cancelamento para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = justificativa_cancelamento.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfe/"+ ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('DELETE', url, false, token);
var cancelar = {
"justificativa": "Sua justificativa aqui!"
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(cancelar));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfe/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
justificativa={}
justificativa["justificativa"] = "Sua justificativa aqui!"
r = requests.delete(url+ref, data=json.dumps(justificativa), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
Para cancelar uma NFe, basta fazer uma requisição à URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Cancelar uma NFe já autorizada:
https://api.focusnfe.com.br/v2/nfe/REFERENCIA
Utilize o comando HTTP DELETE para cancelar a sua nota para nossa API. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.
O parâmetro de cancelamento deverá ser enviado da seguinte forma:
- justificativa: Justificativa do cancelamento. Deverá conter de 15 a 255 caracteres.
A API irá em seguida devolver os seguintes campos:
- status: cancelado, se a nota pode ser cancelada, ou erro_cancelamento, se houve algum erro ao cancelar a nota.
- status_sefaz: O status do cancelamento na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- caminho_xml_cancelamento: Caso a nota tenha sido cancelada, será informado aqui o caminho para download do XML de cancelamento.
Prazo de cancelamento
A NFe poderá ser cancelada em até 24 horas após a emissão. No entanto, alguns estados podem permitir um prazo maior para o cancelamento.
Exemplos de respostas da API por status para a requisição de cancelamento:
cancelado
{
"status_sefaz": "135",
"mensagem_sefaz": "Evento registrado e vinculado a NF-e",
"status": "cancelado",
"caminho_xml_cancelamento": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132550010000000221923094166-can.xml"
}
requisicao_invalida
{
"codigo": "requisicao_invalida",
"mensagem": "Parâmetro \"justificativa\" deve ter entre 15 e 255 caracteres"
}
Carta de Correção Eletrônica
curl -u "token obtido no cadastro da empresa:" \
-X POST -d '{"correcao":"Teste de carta de correcao"}' \
https://homologacao.focusnfe.com.br/v2/nfe/12345/carta_correcao
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$correcao = array (
"correcao" => "Teste de carta de correcao",
);
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server . "/v2/nfe/" . $ref . "/carta_correcao");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($correcao));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
import java.util.HashMap;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFeCCe {
public static void main(String[] args){
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfe/"+ref+"/carta_correcao");
/* Aqui criamos um hashmap para receber a chave "correcao" e o valor desejado. */
HashMap<String, String> correcao = new HashMap<String, String>();
correcao.put("correcao", "Informe aqui os campos que foram corrigidos na NFe.");
/* Criamos um objeto JSON para receber a hash com os dados esperado pela API. */
JSONObject json = new JSONObject(correcao);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfe/" + ref + "/carta_correcao"
# altere os campos conforme a nota que será enviada
correcao = {
correcao: "Informe aqui os campos que foram corrigidos na NFe."
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos a hash de justificativa do cancelamento para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = correcao.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfe/"+ ref + "/carta_correcao";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var cce = {
"correcao": "A sua correção aqui!"
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(cce));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfe/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
cce={}
cce["correcao"] = "A sua correção aqui!"
r = requests.post(url+ref+"/carta_correcao", data=json.dumps(cce), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
Exemplos de respostas da API por status para a requisição de carta de correção:
autorizado
{
"status_sefaz": "135",
"mensagem_sefaz": "Evento registrado e vinculado a NF-e",
"status": "autorizado",
"caminho_xml_carta_correcao": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132550010000000221923094166-cce-01.xml",
"caminho_pdf_carta_correcao": "/notas_fiscais/NFe41190607504505000132550010000000221923094166/cartas_correcao/1.pdf",
"numero_carta_correcao": 1
}
Uma Carta de Correção eletrônica (CCe) pode ser utilizada para corrigir eventuais erros na NFe. As seguintes informações não podem ser corrigidas:
- As variáveis que determinam o valor do imposto tais como: base de cálculo, alíquota, diferença de preço, quantidade, valor da operação ou da prestação;
- A correção de dados cadastrais que implique mudança do remetente ou do destinatário;
- A data de emissão ou de saída.
Não existe prazo especificado para emissão de cartas de correção. É possível enviar até 20 correções diferentes, sendo que será válido sempre a última correção enviada.
Emissão de CCe
https://api.focusnfe.com.br/v2/nfe/REFERENCIA/carta_correcao
Utilize o comando HTTP POST para enviar a sua nota para nossa API. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.
O parâmetros da carta de correção deverão ser enviados da seguinte forma:
- correcao: Texto da carta de correção. Deverá conter de 15 a 1000 caracteres.
- data_evento: Campo opcional. Data do evento da carta de correção. Se não informado será usado a data atual
A API irá em seguida devolver os seguintes campos:
- status: autorizado, se a carta de correção foi aceita pela SEFAZ, ou erro_autorizacao, se houve algum erro ao cancelar a nota.
- status_sefaz: O status da carta de correção na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- caminho_xml_carta_correcao: Informa o caminho do XML da carta de correção, caso ela tenha sido autorizada.
- caminho_pdf_carta_correcao: Informa o caminho do PDF da carta de correção, caso ela tenha sido autorizada.
- numero_carta_correcao: Informa o número da carta de correção, caso ela tenha sido autorizada.
Para uma mesma nota fiscal é possível enviar mais de uma carta de correção, até o limite de 20 correções, sendo que a última sempre substitui a anterior.
Reenvio de e-mail
curl -u "token obtido no cadastro da empresa:" \
-X POST -d '{"emails":["alguem@example.org"]}' \
https://homologacao.focusnfe.com.br/v2/nfe/12345/email
<?php
/* Você deve definir isso globalmente para sua aplicação
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$email = array (
"emails" => array(
"email@email.com"
)
);
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfe/" . $ref . "/email");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($email));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFeEnviaEmail {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfe/"+ref+"/email");
/* Criamos o um objeto JSON que receberá um JSON Array com a lista de e-mails. */
JSONObject json = new JSONObject ();
JSONArray listaEmails = new JSONArray();
listaEmails.put("email_01@acras.com.br");
listaEmails.put("email_02@acras.com.br");
listaEmails.put("email_03@acras.com.br");
json.put("emails", listaEmails);
/* Testar se o JSON gerado está dentro do formato esperado.
System.out.print(json); */
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfe/" + ref + "/email"
# altere os campos conforme a nota que será enviada
emails_destinatarios = {
emails: ["email_01@acras.com.br", "email_02@acras.com.br", "email_03@acras.com.br"]
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos os dados da nota para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = emails_destinatarios.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfe/" + ref + "/email";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var email = ["email1@acras.com.br", "email2@acras.com.br", "email3@acras.com.br"];
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
var json = JSON.stringify({"emails": email});
request.send(json);
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfe/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
emails = {}
email = "suporte@acras.com.br"
emails["emails"] = [email]
r = requests.delete(url+ref+"/email", data=json.dumps(emails), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
Para cada nota autorizada, cancelada ou que tenha sido emitida uma carta de correção o destinatário da nota é notificado via email. Porém eventualmente pode ser necessário enviar a nota fiscal para outras pessoas ou mesmo reenviar o email para o mesmo destinatário.
Para enviar um ou mais emails:
https://api.focusnfe.com.br/v2/nfe/REFERENCIA/email
Utilize o comando HTTP POST para enviar os emails. Esta operação aceita apenas um parâmetro:
- emails: Array com uma lista de emails que deverão receber uma cópia da nota. Limitado a 10 emails por vez.
A API imediatamente devolve a requisição com a confirmação dos emails. Os emails serão enviados em segundo plano, por isso pode levar alguns minutos até que eles cheguem à caixa postal.
Inutilização
curl -u "token obtido no cadastro da empresa:" \
-X POST -d '{"cnpj":"51916585000125","serie":"1","numero_inicial":"7","numero_final":"9","justificativa":"Teste de inutilizacao de nota"}' \
https://homologacao.focusnfe.com.br/v2/nfe/inutilizacao
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$login = "token obtido no cadastro da empresa";
$password = "";
$inutiliza = array (
"cnpj" => "51916585000125",
"serie" => "1",
"numero_inicial" => "7",
"numero_final" => "9",
"justificativa" => "Teste de inutilizacao denota"
);
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfe/inutilizacao");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($inutiliza));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
import java.util.HashMap;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFeInutilizacao {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfe/inutilizacao");
/* Aqui criamos um hash que irá receber as chaves e valores esperados para gerar a inutilização. */
HashMap<String, String> dadosInutilizacao = new HashMap<String, String>();
dadosInutilizacao.put("cnpj", "51916585009999");
dadosInutilizacao.put("serie", "9");
dadosInutilizacao.put("numero_inicial", "7730");
dadosInutilizacao.put("numero_final", "7732");
dadosInutilizacao.put("justificativa", "Informe aqui a justificativa para realizar a inutilizacao da numeracao.");
/* Criamos um objeto JSON que irá receber o input dos dados, para então enviar a requisição. */
JSONObject json = new JSONObject (dadosInutilizacao);
/* Testar se o JSON gerado está dentro do formato esperado.
System.out.print(json); */
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int hHttpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(hHttpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfe/inutilizacao"
# altere os campos conforme a nota que será enviada
dados_inutilizacao = {
cnpj: "51916585009999",
serie: "9",
numero_inicial: "7730",
numero_final: "7732",
justificativa: "Informe aqui a justificativa para realizar a inutilizacao da numeracao."
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos a hash de justificativa do cancelamento para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = dados_inutilizacao.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfe/inutilizacao";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var inutiliza = {
"cnpj": "51916585000125",
"serie": "1",
"numero_inicial": "700",
"numero_final": "703",
"justificativa": "Teste de inutilizacao de nota"
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(inutiliza));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfe/inutilizacao"
token="token obtido no cadastro da empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
inutilizacao={}
inutilizacao["cnpj"] = "CNPJ da empresa emitente"
inutilizacao["serie"] = "Serie da numeracao da NFCe que tera uma faixa de numeracao inutilizada"
inutilizacao["numero_inicial"] = "Numero inicial a ser inutilizado"
inutilizacao["numero_final"] = "Numero final a ser inutilizado"
inutilizacao["justificativa"] = "Justificativa da inutilizacao (minimo 15 caracteres)"
r = requests.post(url, data=json.dumps(inutilizacao), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
Em uma situação normal você não precisará informar ao SEFAZ a inutilização de um número da NFe, pois a API controla automaticamente a numeração das notas. Porém, se por alguma situação específica for necessário a inutilização de alguma faixa de números você poderá chamar as seguintes operações:
Envio de inutilização de faixa de numeração:
https://api.focusnfe.com.br/v2/nfe/inutilizacao
Utilize o comando HTTP POST para enviar a sua inutilização para nossa API. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.
A inutilização precisa dos seguintes parâmetros obrigatórios:
- cnpj: CNPJ da empresa emitente
- serie: Série da numeração da NFe que terá uma faixa de numeração inutilizada
- numero_inicial: Número inicial a ser inutilizado
- numero_final: Número final a ser inutilizado
- justificativa: Justificativa da inutilização (mínimo 15 caracteres)
A API irá enviar uma resposta com os seguintes campos:
- status: autorizado, se a inutilização foi aceita pela SEFAZ, ou erro_autorizacao, se houve algum erro ao inutilizar os números.
- status_sefaz: O status da carta de correção na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- serie: Série da numeração da NFe que terá uma faixa de numeração inutilizada
- numero_inicial: Número inicial a ser inutilizado
- numero_final: Número final a ser inutilizado
- cnpj: CNPJ da empresa
- modelo: Modelo do documento (55 para NFe)
- caminho_xml: Caminho do XML para download caso a inutilização tenha sido autorizada pela SEFAZ.
Em algumas situações em que sejam identificados erros de emissão de forma tardia, nossa API pode decidir pela inutilização de números ao invés de reutilizá-los para outras emissões. Desta forma você pode criar um gatilho (webhook) para ser notificado sempre que houver a inutilização de alguma faixa de numeração. Consulte a seção de gatilhos e utilize o evento chamado "inutilizacao".
Exemplos de respostas da API por status para a requisição de inutilização:
autorizado
{
"status_sefaz": "102",
"mensagem_sefaz": "Inutilizacao de numero homologado",
"serie": "1",
"numero_inicial": "999",
"numero_final": "1000",
"modelo": "55",
"cnpj": "1807504505000130",
"status": "autorizado",
"caminho_xml": "/arquivos_development/07504505000132/201906/XMLs/190750450500013255001000000999000001000-inu.xml"
}
erro_autorizacao
{
"status_sefaz": "256",
"mensagem_sefaz": "Uma NF-e da faixa ja esta inutilizada na Base de dados da SEFAZ",
"serie": "1",
"numero_inicial": "1000",
"numero_final": "1000",
"status": "erro_autorizacao"
}
Outras documentações
Enviador de Arquivos
Uma das formas de se comunicar com o Focus NFe é gerando um arquivo texto no formato especificado.
Para sistemas desktop que não desejam implementar uma comunicação direta com nossos web services criamos um agente de comunicação que lê os arquivos gerados em uma pasta e envia para o Focus NFe. Em um segundo momento o próprio agente consulta o status da nota e faz o download dos arquivos do DANFe e XML da nota.
Como Funciona
Sempre que o comunicador é chamado ele irá seguir os passos abaixo:
- Enviar os arquivos de NFe que estão no diretório de envio e criar uma pendência de retorno para esta nota.
- Enviar os arquivos de cancelamento que estão no diretório de envio e criar uma pendência de retorno para este cancelamento.
- Consultando os retornos pendentes.
- Havendo retorno o comunicador irá gravar o arquivo de retorno com o nome do identificador e a extensão (.ret). Por exemplo, para uma NFe com identificador único 99887766 será gravado o arquivo 99887766.ret no diretório de retorno.
- Se o retorno é referente a uma emissão de NFe e esta nota foi autorizada, o comunicador já irá fazer o download do DANFe e do XML gravando os dois arquivos em um subdiretório do diretório de retorno. Para o DANFe o nome do subdiretório será DANFEs e para o XML será XMLs.
Envio do arquivo para emissão da NFe
A aplicação do cliente deverá gravar um arquivo contendo o conteúdo da NFe e cujo nome é composto de um identificador único e com extensão NFe. Por exemplo, se o identificador único da nota no sistema cliente é 99887766 deverá ser gravado no diretório de envio com a extensão nfe, ou seja 99887766.nfe.
Envio do arquivo para cancelamento de NFe
A aplicação cliente deverá gravar um arquivo contendo um texto de justificativa de cancelamento. O arquivo deverá ser nomeado com o identificador único da nota e com extensão (.can). Em nosso exemplo acima o nome do arquivo seria 99887766.can. Este arquivo deverá ser gravado no diretório de envio de dados.
Envio do carta de correção eletrônica (CCe)
A aplicação cliente deverá gravar um arquivo contendo um texto da correção a ser aplicada. O arquivo deverá ser nomeado com o identificador único da nota e com extensão (.cce) e gravar no diretório de envio de dados.
O PDF e XML da carta de correção serão gravados no diretório de retorno, subdiretório CCes.
Reconsulta de nfe
O comunicador faz adiciona pendências de consulta automaticamente para todo envio e cancelamento comandado. Se por algum motivo houver a necessidade de comandar novamente uma consulta, basta acionar o comunicador com o parâmetro ref e o valor sendo o id único da nota. Por exemplo, para comandar a reconsulta da nota com id único 99887766 basta chamar o comunicador como na linha de comando a seguir:
$ focusNFeFileCommunicator ref=99887766
Importante
O comunicador possui uma execução linear e ao final é desativado. Isto quer dizer que ele não repete as consultas até que as notas estejam em estado final. É de responsabilidade da aplicação do cliente chamar o comunicador de tempos em tempos até que tenha as respostas para seus envios.
Configuração
Após rodar o comunicador pela primeira vez ele irá gerar um arquivo de configuração com informações padrão, como no exemplo ao lado.
[Diretorios] envio =P:envios retorno =P:retornos logs=P:logs [Conexao] url =https://api.focusnfe.com.br/ token={token-enviado-pelo-suporte-focusnfe}
Na seção Diretorios são configurados os diretórios de comunicação (envio e retorno) onde a aplicação do cliente irá salvar e ler arquivos respectivamente. Também é configurado o diretório de logs, onde o comunicador irá gravar os logs das operações realizadas por ele.
A seção Conexão possui duas configurações cruciais para a correta comunicação com o Focus NFe. A url determina o endereço de comunicação que pode ser o de homologação (https://homologacao.focusnfe.com.br) e produção (https://api.focusnfe.com.br).
O token é a chave de acesso, fornecida pelo suporte, que irá garantir que a aplicação do cliente tem acesso ao Focus NFe.
Download
O comunicador foi desenvolvido para uso em sistema operacional Windows, para fazer o download do comunicador clique aqui .
NFCe
Através da API NFCe é possível:
- Emitir uma Nota Fiscal de Consumidor Eletrônica (NFCe) para qualquer Estado que aceita o uso deste documento.
- Cancelar NFCe.
- Consultar NFCe emitidas.
- Reenviar uma NFCe por email.
- Inutilizar o número de alguma série de NFCe.
Todos os processos envolvendo NFCe são síncronos. Ou seja, a emissão não é feita em segundo plano, ao contrário da NFe e NFSe.
URLs
Método | URL (recurso) | Ação |
---|---|---|
POST | /v2/nfce?ref=REFERENCIA | Cria uma nota fiscal e a envia para processamento. |
GET | /v2/nfce/REFERENCIA | Consulta a nota fiscal com a referência informada e o seu status de processamento. |
DELETE | /v2/nfce/REFERENCIA | Cancela uma nota fiscal com a referência informada |
POST | /v2/nfce/REFERENCIA/email | Envia um email com uma cópia da nota fiscal com a referência informada |
POST | /v2/nfce/inutilizacao | Inutiliza uma numeração da nota fiscal |
Campos obrigatórios de uma NFCe
Atualmente, a NFCe possui centenas de campos para os mais variados tipos e formas de operações, por isso, criamos uma página exclusiva que mostra todos os campos da nossa API para o envio de NFCe. Nela, você pode buscar os campos pela TAG XML ou pela nossa tradução para API.
Documentação completa dos campos (versão 4.00 da NFe/NFCe)
Abaixo, iremos mostrar todos os campos de uso mais comum para emissão de uma NFCe.
Abaixo um exemplo de dados de uma nota (usando a versão 4.00 da NFCe):
{
"cnpj_emitente":"05953016000132",
"data_emissao":"2015-11-19T13:54:31-02:00",
"indicador_inscricao_estadual_destinatario":"9",
"modalidade_frete":"9",
"local_destino":"1",
"presenca_comprador":"1",
"natureza_operacao":"VENDA AO CONSUMIDOR",
"items":[
{
"numero_item":"1",
"codigo_ncm":"62044200",
"quantidade_comercial":"1.00",
"quantidade_tributavel":"1.00",
"cfop":"5102",
"valor_unitario_tributavel":"79.00",
"valor_unitario_comercial":"79.00",
"valor_desconto":"0.00",
"descricao":"NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"codigo_produto":"251887",
"icms_origem":"0",
"icms_situacao_tributaria":"102",
"unidade_comercial":"un",
"unidade_tributavel":"un",
"valor_total_tributos":"24.29"
}
],
"formas_pagamento":[
{
"forma_pagamento":"03",
"valor_pagamento":"79.00",
"nome_credenciadora":"Cielo",
"bandeira_operadora":"02",
"numero_autorizacao":"R07242"
}
]
}
Geral
Campo | Tipo | Obrigatório | Descrição | Validação |
---|---|---|---|---|
natureza_operacao | texto | sim | Descrição da natureza de operação. | Caso não informado, será utilizado o texto “VENDA AO CONSUMIDOR”. |
data_emissao | data e hora | sim | Data e hora de emissão com timezone. | Utilize o formato ISO, exemplo 2015-11-19T13:54:31-02:00. Diferença máxima permitida de 5 minutos do horário atual. |
presenca_comprador | numérico | sim | Presença do comprador.Valores possíveis:1 – Operação presencial.4 – Entrega a domicílio. | |
informacoes_adicionais _contribuinte | texto | não | Informações adicionais. | |
cnpj_emitente | texto | sim | CNPJ da empresa que está emitindo a NFCe. | CNPJ válido. |
Destinatário
Campo | Tipo | Obrigatório | Descrição | Validação |
---|---|---|---|---|
nome_destinatario | texto | não | Nome do consumidor. | |
cnpj_destinatario | texto | não | CNPJ do consumidor. | Enviar em branco ou documento válido. |
cpf_destinatario | texto | não | CPF do consumidor. | Enviar em branco ou documento válido. |
telefone_destinatario | texto | não | Telefone do consumidor. | |
logradouro_destinatario | texto | não | Logradouro do consumidor. | |
numero_destinatario | texto | não | Número do endereço do consumidor. | |
bairro_destinatario | texto | não | Bairro do consumidor. | |
municipio_destinatario | texto | não | Município do consumidor. | |
uf_destinatario | texto | não | Sigla da UF do consumidor. | |
cep_destinatario | texto | não | CEP do consumidor. |
Itens
Os dados dos itens da NFCe devem ser enviados dentro de um Array JSON. O nome que este array deve ter é “itens“.
Campo | Tipo | Obrigatório | Descrição |
---|---|---|---|
numero_item | numérico | sim | Número do item. Comece com 1 e aumente sequencialmente para cada item da NFCe. |
codigo_ncm | texto | sim | Código NCM do produto (8 dígitos). |
codigo_produto | texto | sim | Código do produto. |
descricao | texto | sim | Descrição do produto. |
quantidade_comercial | numérico | sim | Quantidade do item. |
quantidade_tributavel | numérico | sim | Quantidade tributável do item. Caso não se aplique utilize o mesmo valor de quantidade_comercial. |
cfop | texto | sim | Código Fiscal da operação. Utilize algum CFOP da operação válido para Nota ao Consumidor. |
valor_unitario_comercial | numérico | sim | Valor unitário do item. |
valor_unitario_tributavel | numérico | sim | Valor unitário tributável do item. Caso não se aplique utilize o mesmo valor que valor_unitario_comercial. |
valor_bruto | numérico | sim | Valor bruto do item. Calculado como valor_unitario_comercial * quantidade_comercial |
unidade_comercial | texto | sim | Unidade comercial do produto. Você pode utilizar valores como “KG”, “L”, “UN”, etc. Caso não se aplique utilize “UN”. |
unidade_tributavel | texto | sim | Unidade tributável do produto. Caso não se aplique utilize o mesmo valor do campo unidade_comercial. |
icms_origem | valor da lista | sim | Valores Possíveis: 0: nacional. 1: estrangeira (importação direta). 2: estrangeira (adquirida no mercado interno). 3: nacional com mais de 40% de conteúdo estrangeiro. 4: nacional produzida através de processos produtivos básicos. 5: nacional com menos de 40% de conteúdo estrangeiro. 6: estrangeira (importação direta) sem produto nacional similar. 7: estrangeira (adquirida no mercado interno) sem produto nacional similar. |
icms_situacao_tributaria | valor da lista | sim | Valores possíveis: Para empresas optantes do SIMPLES: 102 – Tributada pelo Simples Nacional sem permissão de crédito, 300 - Imune, 500 - CMS cobrado anteriormente por substituição tributária (substituído) ou por antecipação. Para empresas não optantes do SIMPLES: 00 – tributada integralmente, 40 – Isenta, 41 - Não tributada, 60 - ICMS cobrado anteriormente por substituição tributária |
icms_aliquota | numérico | Obrigatório se icms_situacao_tributaria = 00 | Alíquota do ICMS. Deve estar entre 0 e 100. |
icms_base_calculo | numérico | Obrigatório se icms_situacao_tributaria = 00 | Base de cálculo do ICMS. Normalmente é igual ao valor_bruto. |
icms_modalidade_base _calculo | valor da lista | Obrigatório se icms_situacao_tributaria = 00 | Modalidade da base de cálculo do ICMS.Valores possíveis:0 – margem de valor agregado (%).1 – pauta (valor).2 – preço tabelado máximo (valor).3 – valor da operação. |
valor_desconto | numérico | Valor do desconto do item. | |
valor_frete | numérico | Valor do frete do item. Usado apenas se entrega a domicílio. O frete deve ser “rateado” entre todos os itens. |
Transportador
Campo | Tipo | Obrigatório | Descrição |
---|---|---|---|
cnpj_transportador | string | sim se presenca_comprador = 4 | CNPJ do transportador. Se este campo for informado não deverá ser informado cpf_transportador. |
cpf_transportador | string | sim se presenca_comprador = 4 | CPF do transportador. Se este campo for informado não deverá ser informado cnpj_transportador. |
nome_transportador | string | sim se presenca_comprador = 4 | Nome ou razão social do transportador. |
inscricao_estadual_transportador | string | sim se presenca_comprador = 4 | Inscrição Estadual do transportador. |
endereco_transportador | string | sim se presenca_comprador = 4 | Endereço (logradouro, número, complemento e bairro) do transportador. |
municipio_transportador | string | sim se presenca_comprador = 4 | Município do transportador. |
uf_transportador | string | sim se presenca_comprador = 4 | UF do transportador. |
Pagamento
Os dados abaixo devem ser enviados dentro de um Array JSON. O nome que este array deve ter é “formas_pagamento“.
Campo | Tipo | Obrigatório | Descrição |
---|---|---|---|
forma_pagamento | valor da lista | sim | Forma do recebimento. Valores possíveis:01: Dinheiro.02: Cheque.03: Cartão de Crédito.04: Cartão de Débito.05: Crédito Loja.10: Vale Alimentação.11: Vale Refeição.12: Vale Presente.13: Vale Combustível.99: Outros |
valor_pagamento | numérico | sim | Valor do recebimento. |
tipo_integracao | valor da lista | não | Tipo de Integração para pagamento. Valores possíveis:1: Pagamento integrado com o sistema de automação da empresa (Ex.: equipamento TEF, Comércio Eletrônico) – Obrigatório informar cnpj_credenciadora e numero_autorizacao.2: Pagamento não integrado com o sistema de automação da empresa (valor padrão). Informar apenas se forma_pagamento for 03 ou 04. |
cnpj_credenciadora | numérico | Obrigatório se tipo_integracao for 1 | CNPJ da credenciadora do cartão de crédito. Somente CNPJ válido. |
numero_autorizacao | string | Obrigatório se tipo_integracao for 1 | |
bandeira_operadora | string | Obrigatório se forma_pagamento = 03 ou 04 (pagamento em cartão) | Bandeira da operadora de cartão de crédito e/ou débito. Valores possíveis:01: Visa.02: Mastercard.03: American Express.04: Sorocred.99: Outros. |
Totalizadores
Campos | Tipo | Obrigatório | Descrição |
---|---|---|---|
valor_produtos | numérico | não | Valor total dos produtos. Calculado automaticamente se não informado. |
valor_desconto | numérico | não | Valor total dos descontos. Calculado automaticamente se não informado. |
valor_total | numérico | não | Valor líquido dos produtos. Deve ser igual a valor_produtos – valor_desconto. Calculado automaticamente se não informado. |
valor_frete | numérico | não | Valor total do frete. Deve conter o somatório do valor do frete dos itens (usado apenas em entrega a domicílio). Calculado automaticamente se não informado. |
icms_valor_total | numérico | não | Valor total de ICMS dos produtos. Deve ser o somatório dos valores contidos em icms_valor nos items. Calculado automaticamente se não informado. |
icms_base_calculo | numérico | sim, se algum item tem icms_situacao_tributaria = 00 | Valor total da base de cálculo do ICMS dos produtos. Deve ser o somatório dos valores contidos em icms_base_calculo nos items. Calculado automaticamente se não informado. |
Campos calculados automaticamente
Para simplificar o envio da nota fiscal, alguns campos são calculados automaticamente a partir da versão 4.00 da NFCe. Os campos calculados são somatórios de campos fornecidos nos itens da nota fiscal. Os campos serão calculados apenas se eles não forem informados na API.
A lista de campos calculados automaticamente segue abaixo:
Campo | Somatório de campo dos itens | Observação |
---|---|---|
icms_base_calculo | icms_base_calculo | |
valor_ipi | ipi_valor | |
icms_valor_total_st | icms_valor_st | |
issqn_base_calculo | issqn_base_calculo | |
issqn_valor_total | issqn_valor | |
issqn_valor_total_deducao | issqn_valor_deducao | |
issqn_valor_total_outras_retencoes | issqn_valor_outras_retencoes | |
issqn_valor_total_desconto_incondicionado | issqn_valor_desconto_incondicionado | |
issqn_valor_total_desconto_condicionado | issqn_valor_desconto_condicionado | |
issqn_valor_total_retencao | issqn_valor_retencao | |
issqn_base_calculo | issqn_base_calculo | |
valor_total_ii | ii_valor | |
fcp_valor_total | fcp_valor | |
fcp_valor_total_uf_destino | fcp_valor_uf_destino | |
fcp_valor_total_st | fcp_valor_st | |
fcp_valor_total_retido_st | fcp_valor_retido_st | |
icms_valor_total_uf_destino | icms_valor_uf_destino | |
icms_valor_total_uf_remetente | icms_valor_uf_remetente | |
icms_base_calculo | icms_base_calculo | |
icms_valor_total | icms_valor | |
icms_valor_total_desonerado | icms_valor_desonerado | |
icms_base_calculo_st | icms_base_calculo_st | |
icms_valor_total_st | icms_valor_st | |
valor_frete | valor_frete | |
valor_seguro | valor_seguro | |
valor_outras_despesas | valor_outras_despesas | |
valor_desconto | valor_desconto | |
valor_ipi_devolvido | valor_ipi_devolvido | |
valor_total_tributos | valor_total_tributos | |
valor_produtos | valor_bruto | Apenas se inclui_no_total=1 |
valor_total_servicos | valor_bruto | Apenas se inclui_no_total=1 e item de serviço |
icms_valor_total | icms_valor | Apenas se icms_situacao_tributaria diferente de40, 41 e 50. |
valor_pis_servicos | pis_valor | Apenas se item de serviço |
valor_cofins_servicos | cofins_valor | Apenas se item de serviço |
valor_pis | pis_valor | Apenas se não for item de serviço |
valor_cofins | cofins_valor | Apenas se não for item de serviço |
Além disso, caso não seja fornecido, será calculado também o valor total da NFCe (valor_total), calculado da seguinte forma:
valor_produtos – valor_desconto – icms_valor_total_desonerado + icms_valor_total_st + valor_frete + valor_seguro + valor_outras_despesas + valor_total_ii + valor_ipi + valor_total_servicos
Além dos campos acima, os campos abaixo são preenchidos automaticament para NFCe, pois tem apenas um conteúdo válido possível:
- tipo_documento = 1, significando “Nota de saída”
- consumidor_final = 1, significando “Nota para consumidor final”
- finalidade_emissao = 1, significando “Nota normal”
Status API
Aqui você encontra os status possíveis para NFCe.
HTTP CODE/STATUS | Status API Focus | Descrição | Correção |
---|---|---|---|
404 - not found | nfce_nao_encontrada | NFCe não encontrada | Verifique se a NFCe informada existe e está autorizada. |
404 - not found | nfce_nao_autorizada | NFCe não autorizada | O cancelamento só é possível para NFCe's autorizadas. |
400 - bad request | justificativa_nao_informada | Parâmetro "justificativa" não informado | É necessário usar o parâmetro 'justificativa'. Consulte a nossa documentação. |
400 - bad request | forma_emissao_nao_informada | Parâmetro "forma_emissao" inválido ou não informado | Verifique o valor informado no campo "forma_emissao". Consulte a nossa documentação. |
400 - bad request | ref_ausente | Parâmetro "ref" não informado | É necessário usar o parâmetro 'ref' nessa requisição com a API. Consulte a nossa documentação. |
422 - unprocessable entity | ambiente_nao_configurado | Ambiente não configurado para emissão de NFCe | O ambiente de emissão de NFCe não foi configurado para o seu emitente. Entre em contato com a nossa equipe de suporte. |
422 - unprocessable entity | empresa_nao_configurada | Empresa não configurada para emissão de NFCe | É necessário informar no cadastro do emitente(Painel API) o CSC e id_token(gerados na Sefaz do Estado do emitente), para emissão de NFCe. |
Envio
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfce"
# Substituir pela sua identificação interna da nota
ref = {"ref":"1234"}
token="token obtido no cadastro da empresa"
'''
Usamos dicionarios para armazenar os campos e valores que em seguida,
serao convertidos em JSON e enviados para nossa API
'''
nfce = {}
items = {}
formas_pagamento={}
nfce["cnpj_emitente"] = "99999999999999"
nfce["nome_emitente"] = "Acme ink"
nfce["nome_fantasia_emitente"] = "Acme ink"
nfce["logradouro_emitente"] = "Rua Tupiniquim"
nfce["numero_emitente"] = "4000"
nfce["bairro_emitente"] = "Brás"
nfce["municipio_emitente"] = "São Paulo"
nfce["uf_emitente"] = "SP"
nfce["cep_emitente"] = "99997-000"
nfce["inscricao_estadual_emitente"] = "111111111"
nfce["data_emissao"] = "2018-03-06T17:11:00.939-03:00"
nfce["natureza_operacao"] = "Venda ao Consumidor"
nfce["tipo_documento"] = "1"
nfce["presenca_comprador"] = "1"
nfce["finalidade_emissao"] = "1"
nfce["modalidade_frete"] = "9"
nfce["forma_pagamento"] = "0"
nfce["nome_destinatario"] = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"
nfce["cpf_destinatario"] = "99999999999"
nfce["informacoes_adicionais_contribuinte"] = "Informacoes adicionais do contribuinte"
nfce["valor_produtos"] = "15.0"
nfce["valor_desconto"] = "0.00"
nfce["valor_total"] = "15.0"
formas_pagamento["forma_pagamento"] = "4"
formas_pagamento["valor_pagamento"] = "15.00"
formas_pagamento["bandeira_operadora"] = "7"
formas_pagamento["troco"] = "0"
itens["numero_item"] = "1"
itens["codigo_produto"] = "353"
itens["descricao"] = "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"
itens["codigo_ncm"] = "48024090"
itens["cfop"] = "5102"
itens["valor_desconto"] = "0.00"
itens["icms_origem"] = "0"
itens["icms_situacao_tributaria"] = "400"
itens["unidade_comercial"] = "UN"
itens["unidade_tributavel"] = "UN"
itens["quantidade_comercial"] = "10"
itens["quantidade_tributavel"] = "10"
itens["valor_unitario_comercial"] = "1.5"
itens["valor_unitario_tributavel"] = "1.5"
itens["valor_bruto"] = "15.00"
# Adicionamos os dados das variaveis itens e formas_pagamento como listas ao dicionario principal.
nfce["items"] = [itens]
nfce["formas_pagamento"] = [formas_pagamento]
r = requests.post(url, params=ref, data=json.dumps(nfce), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
# arquivo.json deve conter os dados da NFCe
curl -u "token obtido no cadastro da empresa:" \
-X POST -T arquivo.json https://homologacao.focusnfe.com.br/v2/nfce
import java.util.HashMap;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFCeAutorizar {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfce?ref="+ ref+"&completa=1");
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
/* Aqui são criados as hash's que receberão os dados da nota. */
HashMap<String, String> nfce = new HashMap<String, String>();
HashMap<String, String> itens = new HashMap<String, String>();
HashMap<String, String> formasPagamento = new HashMap<String, String>();
nfce.put("data_emissao", "2018-01-15T16:25:00");
nfce.put("consumidor_final", "1");
nfce.put("modalidade_frete", "9");
nfce.put("natureza_operacao", "Venda ao Consumidor");
nfce.put("tipo_documento", "1");
nfce.put("finalidade_emissao", "1");
nfce.put("presenca_comprador", "1");
nfce.put("indicador_inscricao_estadual_destinatario", "9");
nfce.put("cnpj_emitente", "51916585000125");
nfce.put("cpf_destinatario", "");
nfce.put("id_estrangeiro_destinatario", "1234567");
nfce.put("nome_destinatario", "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL");
nfce.put("informacoes_adicionais_contribuinte", "Documento emitido por ME ou EPP optante pelo Simples Nacional nao gera direito a credito fiscal de ICMS lei 123/2006.");
nfce.put("valor_produtos", "1.0000");
nfce.put("valor_desconto", "0.0000");
nfce.put("valor_total", "1.0000");
nfce.put("forma_pagamento", "0");
nfce.put("icms_base_calculo", "0.0000");
nfce.put("icms_valor_total", "0.0000");
nfce.put("icms_base_calculo_st", "0.0000");
nfce.put("icms_valor_total_st", "0.0");
nfce.put("icms_modalidade_base_calculo", "3");
nfce.put("valor_frete", "0.0");
itens.put("numero_item", "1");
itens.put("unidade_comercial", "PC");
itens.put("unidade_tributavel", "PC");
itens.put("codigo_ncm", "94019090");
itens.put("codigo_produto", "Div.13350000");
itens.put("descricao", "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL");
itens.put("cfop", "5102");
itens.put("valor_unitario_comercial", "1.0000000000");
itens.put("valor_unitario_tributavel", "1.0000000000");
itens.put("valor_bruto", "1.0000");
itens.put("quantidade_comercial", "1.0000");
itens.put("quantidade_tributavel", "1.0000");
itens.put("quantidade", "1.0000");
itens.put("icms_origem", "0");
itens.put("icms_base_calculo", "1.00");
itens.put("icms_modalidade_base_calculo", "3");
itens.put("valor_frete", "0.0");
itens.put("valor_outras_despesas", "0.0");
itens.put("icms_situacao_tributaria", "102");
formasPagamento.put("forma_pagamento", "99");
formasPagamento.put("valor_pagamento", "1.0000");
/* Depois de fazer o input dos dados, são criados os objetos JSON já com os valores das hash's. */
JSONObject json = new JSONObject (nfce);
JSONObject jsonItens = new JSONObject (itens);
JSONObject jsonPagamento = new JSONObject (formasPagamento);
/* Aqui adicionamos os objetos JSON nos campos da API como array no JSON principal. */
json.append("items", jsonItens);
json.append("formas_pagamento", jsonPagamento);
/* É recomendado verificar como os dados foram gerados em JSON e se ele está seguindo a estrutura especificada em nossa documentação.
System.out.print(json); */
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas a seguir exibem as informações retornadas pela nossa API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfce?ref=" + ref
# altere os campos conforme a nota que será enviada
dados_da_nota = {
cnpj_emitente: "05953016000132",
data_emissao: "2017-12-06 14:45:10",
indicador_inscricao_estadual_destinatario: "9",
modalidade_frete: "9",
local_destino: "1",
presenca_comprador: "1",
natureza_operacao: "VENDA AO CONSUMIDOR",
items: [
numero_item: "1",
codigo_ncm: "62044200",
quantidade_comercial: "1.00",
quantidade_tributavel: "1.00",
cfop: "5102",
valor_unitario_tributavel: "79.00",
valor_unitario_comercial: "79.00",
valor_desconto: "0.00",
descricao: "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
codigo_produto: "251887",
icms_origem: "0",
icms_situacao_tributaria: "102",
unidade_comercial: "un",
unidade_tributavel: "un",
valor_total_tributos: "24.29"
],
formas_pagamento: [
forma_pagamento: "03",
valor_pagamento: "79.00",
nome_credenciadora: "Cielo",
bandeira_operadora: "02",
numero_autorizacao: "R07242"
]
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos os dados da nota para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = dados_da_nota.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$nfe = array (
"cnpj_emitente" => "51916585000125",
"data_emissao" => "2017-12-07T12:40:10",
"indicador_inscricao_estadual_destinatario" => "9",
"modalidade_frete" => "9",
"local_destino" => "1",
"presenca_comprador" => "1",
"natureza_operacao" => "VENDA AO CONSUMIDOR",
"itens" => array(
array(
"numero_item" => "1",
"codigo_ncm" => "62044200",
"quantidade_comercial" => "1.00",
"quantidade_tributavel" => "1.00",
"cfop" => "5102",
"valor_unitario_tributavel" => "1.00",
"valor_unitario_comercial" => "1.00",
"valor_desconto" => "0.00",
"descricao" => "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"codigo_produto" => "251887",
"icms_origem" => "0",
"icms_situacao_tributaria" => "102",
"unidade_comercial" => "un",
"unidade_tributavel" => "un",
"valor_total_tributos" => "1.00"
)
),
"formas_pagamento" => array(
array(
"forma_pagamento" => "03",
"valor_pagamento" => "1.00",
"nome_credenciadora" => "Cielo",
"bandeira_operadora" => "02",
"numero_autorizacao" => "R07242"
)
),
);
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfce?ref=" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($nfe));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfce?ref=" + ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var nfce = {
"natureza_operacao":"VENDA AO CONSUMIDOR",
"data_emissao":"2018-03-21T11:52:00-03:00",
"tipo_documento":"1",
"presenca_comprador":"1",
"consumidor_final":"1",
"finalidade_emissao":"1",
"cnpj_emitente":"51916585000125",
"nome_destinatario":"",
"cpf_destinatario":"",
"informacoes_adicionais_contribuinte":"RETIRADA POR CONTA DO DESTINATÁRIO",
"valor_produtos":"1.00",
"valor_desconto":"0.00",
"valor_total":"1.00",
"forma_pagamento":"0",
"icms_valor_total":"0",
"modalidade_frete": "9",
"items":[
{"numero_item":"1",
"codigo_ncm":"84713012",
"codigo_produto":"999",
"descricao":"NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"quantidade_comercial":"1.00",
"quantidade_tributavel":"1.00",
"cfop":"5102",
"valor_unitario_comercial":"1.00",
"valor_unitario_tributavel":"1.00",
"valor_bruto":"1.00",
"unidade_comercial":"un",
"unidade_tributavel":"un",
"icms_origem":"2",
"icms_situacao_tributaria":"102",
"icms_aliquota":"0",
"icms_base_calculo":"0",
"icms_modalidade_base_calculo":"3"
}
],
"formas_pagamento":[
{"forma_pagamento":"1",
"valor_pagamento":"1.00"
}
]
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(nfce));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Para enviar uma NFCe utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Envia uma NFCe para autorização:
https://api.focusnfe.com.br/v2/nfce?ref=REFERENCIA&completa=(0|1)
Utilize o comando HTTP POST para enviar a sua nota para nossa API. A URL recebe como parâmetro a referência no campo “ref” e pode ser informado opcionalmente o campo “completa” com o valor 1 (verdadeiro) ou 0 (falso). Este parâmetro indica se será exibida a nota completa caso ela seja autorizada. Esta operação é detalhada na próxima seção.
Envie como corpo do POST os dados em formato JSON da nota fiscal.
A numeração da nota (número e série) pode ser definido automaticamente pela API, nós recomendamos que deixe a sua numeração sob nossa responsabilidade, por questões de simplicidade. Entretanto, você pode controlar o envio destas informações pela sua aplicação, basta informar os campos “numero” e “serie” nos dados de envio.
O envio de uma NFCe é um processo síncrono, ou seja, diferente da NFe a nota é autorizada ou rejeitada na mesma requisição. A resposta da requisição irá conter o mesmo resultado que a operação da consulta, descrita a seguir.
Exemplos de respostas da API por status para a requisição de envio:
autorizado
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899",
"status": "autorizado",
"status_sefaz": "100",
"mensagem_sefaz": "Autorizado o uso da NF-e",
"chave_nfe": "NFe41190607504505000132650010000000121743484310",
"numero": "12",
"serie": "1",
"caminho_xml_nota_fiscal": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132650010000000121743484310-nfe.xml",
"caminho_danfe": "/notas_fiscais_consumidor/NFe41190607504505000132650010000000121743484310.html",
"qrcode_url": "http://www.fazenda.pr.gov.br/nfce/qrcode/?p=41190607504505000132650010000000121743484310|2|2|1|5E264C0E28D801197219894CDFCF2FCCC5237F08",
"url_consulta_nf": "http://www.fazenda.pr.gov.br/nfce/consulta"
}
autorizado em contingência offline e ainda não efetivado
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899",
"status": "autorizado",
"status_sefaz": "100",
"mensagem_sefaz": "Autorizado o uso da NF-e",
"chave_nfe": "NFe41190607504505000132650010000000121743484310",
"numero": "12",
"serie": "1",
"caminho_xml_nota_fiscal": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132650010000000121743484310-nfe.xml",
"caminho_danfe": "/notas_fiscais_consumidor/NFe41190607504505000132650010000000121743484310.html",
"qrcode_url": "http://www.fazenda.pr.gov.br/nfce/qrcode/?p=41190607504505000132650010000000121743484310|2|2|1|5E264C0E28D801197219894CDFCF2FCCC5237F08",
"url_consulta_nf": "http://www.fazenda.pr.gov.br/nfce/consulta",
"contingencia_offline": true,
"contingencia_offline_efetivada": false
}
erro_autorizacao
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899",
"status": "erro_autorizacao",
"status_sefaz": "591",
"mensagem_sefaz": "Informado CSOSN para emissor que nao e do Simples Nacional (CRT diferente de 1). [nItem:1]"
}
Emissão automática em contingência offline
Ao tentar emitir uma NFCe, iremos tentar comunicação com a SEFAZ. Caso a comunicação seja realizada com sucesso, a nota será emitida e a DANFCe gerada. Porém, caso a comunicação não seja possível, iremos imediatamente emitir uma outra nota (com numeração subsequente) em contingência offline, nos estados onde isso for possível. Isso significa gerar um XML e DANFCe temporários até que a comunicação com a SEFAZ seja reestabelecida. Ao final, os dados gerados serão devolvidos na requisição de autorização. Todo este processo é síncrono.
É necessário emitir uma outra nota pois não há garantias de que a SEFAZ não tenha recebido a requisição original. Desta forma, é mais prudente emitir a nota com outro número e posteriormente consultar a nota original para confirmar o seu status, assim evitamos erros de duplicidade de numeração ao fazer a efetivação da contingência quando os servidores da SEFAZ voltarem a responder.
Será de responsabilidade de nossa API, após devolver o XML e DANFCe temporários, tentar reestabelecer comunicação com a SEFAZ ao longo das próximas 24 horas após a emissão. Quando conseguirmos conectividade novamente serão efetuadas duas ações:
- A nota emitida em contingência será efetividade na SEFAZ e iremos substituir o XML e DANFCe por suas versões definitivas
- Iremos consultar o status da requisição original. Caso a nota tenha sido autorizada, é feito o cancelamento da nota. Caso ela realmente não tenha sido autorizada, o número é reaproveitado para as próximas emissões.
O sistema cliente da API pode acompanhar este processo de forma transparente, conforme descrito na seção “Consulta” deste manual.
Emissão manual em contingência offline
A emissão automática em contingência contempla o caso em que o SEFAZ esteja fora do ar mas não contempla o caso em que sua aplicação esteja sem conexão com a Internet. Neste caso você pode optar por fazer uma emissão manual em contingência nos estados onde isto é autorizado.
De forma resumida, isto poderá ser feito da seguinte forma:
- Sua aplicação emite uma DANFCe - sem se comunicar com o nosso sistema - em duas vias (uma para ficar no estabelecimento e outra entregue ao cliente)
- Após identificar que sua conexão foi reestabelecida, você envia os dados da nota para nossa API informando todos os dados utilizados na NFCe (incluindo número e série da nota) e informando o parâmetro "forma_emissao" com o valor "offline".
Para conseguir realizar estas tarefas, sua aplicação deverá manter um controle de numeração de notas emitidas em contingência. A série utilizada deverá ser diferente daquela utilizada pelo nosso sistema. Por exemplo: se nosso sistema emite com a série 1 o seu sistema poderá emitir notas em contingência com a série 600, por exemplo.
Ao emitir a nota em nossa API, você deverá chamar nossa URL acrescentando o campo "forma_emissao" com o valor "offline". Por exemplo, se você está fazendo testes no ambiente de homologação, e enviando a nota com a referência "123", você deverá chamar a seguinte URL:
https://homologacao.focusnfe.com.br/v2/nfce?ref=123&forma_emissao=offline
Nos dados JSON da nota, acrescente os seguintes campos:
- numero - O número da nota
- serie - A série de contingência
- codigo_unico - O código único (tag cNF) utilizado na geração da chave da NFe
Usando esta forma de emissão, a SEFAZ irá autorizar notas mesmo com a data de emissão retroativa.
Consulta
# Faça o download e instalação da biblioteca requests, através do python-pip.
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfce/"
# Substituir pela sua identificação interna da nota
ref = "1234"
token="token obtido no cadastro da empresa"
# Use este parametro para obter mais informacoes em suas consultas
completa = "completa=1"
r = requests.get(url+ref, params=completa, auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)l
curl -u "token obtido no cadastro da empresa:" \
https://homologacao.focusnfe.com.br/v2/nfce/12345
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFCeConsulta {
public static void main(String[] args) {
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfce/"+ref+"?completa=1");
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.get(ClientResponse.class);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfce/" + ref
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Get a partir da uri de requisição
requisicao = Net::HTTP::Get.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfce/" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfce/" + ref + "?completa=1";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('GET', url, false, token);
request.send();
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Para consultar uma NFCe utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Consultar as informações de uma NFCe:
https://api.focusnfe.com.br/v2/nfce/REFERENCIA?completa=(0|1)
Utilize o comando HTTP GET para consultar a sua nota para nossa API.
Parâmetro Opcional | Ação |
---|---|
completa = 0 ou 1 | Habilita a API há mostrar campos adicionais na requisição de consulta. |
Exemplo de resposta da consulta de NFCe (completa=0):
{
"status":"autorizado",
"status_sefaz":"100",
"mensagem_sefaz":"Autorizado o uso da NF-e",
"cnpj_emitente":"SEU_CNPJ",
"ref":"REFERENCIA",
"chave_nfe":"NFe41170777627353999172550010000003871980884091",
"numero":"387",
"serie":"1",
"caminho_xml_nota_fiscal":"/arquivos/733530172/201704/XMLs/41170777627353999172550010000003871980884091-nfe.xml",
"caminho_danfe":"/arquivos/733530172/201704/DANFEs/41170777627353999172550010000003871980884091.pdf"
}
Campos de retorno:
- status: A situação da NFCe, podendo ser:
- autorizado: A nota foi autorizada, neste caso é fornecido os dados completos da nota como chave e arquivos para download
- cancelado: O documento foi cancelado, neste caso é fornecido o caminho para download do XML de cancelamento (caminho_xml_cancelamento).
- erro_autorizacao: Houve um erro de autorização por parte da SEFAZ. A mensagem de erro você encontrará nos campos status_sefaz e mensagem_sefaz. É possível fazer o reenvio da nota com a mesma referência se ela estiver neste estado.
- denegado: O documento foi denegado. Uma SEFAZ pode denegar uma nota se houver algum erro cadastral nos dados do destinatário ou do emitente. A mensagem de erro você encontrará nos campos status_sefaz e mensagem_sefaz. Não é possível reenviar a nota caso este estado seja alcançado pois é gerado um número, série, chave de NFe e XML para esta nota. O XML deverá ser armazenado pelo mesmo período de uma nota autorizada ou cancelada.
- status_sefaz: O status da nota na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- serie: A série da nota fiscal, caso ela tenha sido autorizada.
- numero: O número da nota fiscal, caso ela tenha sido autorizada.
- cnpj_emitente: O CNPJ emitente da nota fiscal (o CNPJ de sua empresa).
- ref: A referência da emissão.
- chave_nfe: A chave da NFe, caso ela tenha sido autorizada.
- caminho_xml_nota_fiscal: caso a nota tenha sido autorizada, retorna o caminho para download do XML.
- caminho_danfe: caso a nota tenha sido autorizada retorna o caminho para download do DANFe.
- caminho_xml_cancelamento: Caso a nota esteja cancelada, é fornecido o caminho para fazer o download do XML de cancelamento.
- contingencia_offline Este campo irá aparecer apenas quando a nota tiver sido emitida em contingência offline.
- contingencia_offline_efetivada Quando a nota tiver sido emitida em contingência offline, este campo irá mostrar se a nota já foi efetivada (transmitida para a SEFAZ) ou não.
- tentativa_anterior: Nos casos de contingência offline, esta chave irá conter outros campos quando conseguirmos determinar o que houve com a tentativa original. Esta seção poderá conter os seguintes campos:
- status: autorizado, processando_autorizacao ou cancelado. A API irá automaticamente proceder com o cancelamento quando necessário
- serie
- numero
- chave_nfe
- caminho_xml_nota_fiscal
- caminho_xml_cancelamento
Caso na requisição seja passado o parâmetro completa=1
será adicionado mais 6 campos:
- requisicao_nota_fiscal: Inclui os dados completos da requisição da nota fiscal, da mesma forma que constam no XML da nota.
- protocolo_nota_fiscal: Inclui os dados completos do protocolo devolvido pela SEFAZ.
- requisicao_cancelamento: Inclui os dados completos da requisição de cancelamento da nota fiscal.
- protocolo_cancelamento: Inclui os dados completos do protocolo devolvido pela SEFAZ.
- requisicao_carta_correcao: Inclui os dados completos da requisição de Carta de Correção Eletrônica da NFe.
- protocolo_carta_correcao: Inclui os dados completos do protocolo devolvido pela SEFAZ.
Exemplo de resposta usando o parâmetro opcional, completa, recebendo o valor "1":
{
"requisicao_cancelamento": {
"versao": "1.00",
"id_tag": "ID1101119118017764335300017255003000000025138154946401",
"codigo_orgao": "41",
"ambiente": "2",
"cnpj": "CNPJ_DO_EMITENTE",
"chave_nfe": "91180177643353000172550030000000251381549464",
"data_evento": "2012-01-17T16:00:28-02:00",
"tipo_evento": "110111",
"numero_sequencial_evento": "1",
"versao_evento": "1.00",
"descricao_evento": "Cancelamento",
"protocolo": "141180000026777",
"justificativa": "Informe aqui a sua justificativa para realizar o cancelamento da NFe."
},
"protocolo_cancelamento": {
"versao": "1.00",
"ambiente": "2",
"versao_aplicativo": "PR-v3_8_7",
"codigo_orgao": "41",
"status": "135",
"motivo": "Evento registrado e vinculado a NF-e",
"chave_nfe": "91180177643353000172550030000000251381549464",
"tipo_evento": "110111",
"descricao_evento": "Cancelamento",
"data_evento": "2012-01-17T16:00:31-02:00",
"numero_protocolo": "141180000026777"
},
"requisicao_carta_correcao": {
"versao": "1.00",
"id_tag": "ID1101109118017764335300017255003000000025138154946401",
"codigo_orgao": "41",
"ambiente": "2",
"cnpj": "CNPJ_DO_EMITENTE",
"chave_nfe": "91180177643353000172550030000000251381549464",
"data_evento": "2012-01-17T15:59:34-02:00",
"tipo_evento": "110110",
"numero_sequencial_evento": "1",
"versao_evento": "1.00",
"descricao_evento": "Carta de Correcao",
"correcao": "Informe aqui os campos que foram corrigidos na NFe.",
"condicoes_uso": "A Carta de Correcao e disciplinada pelo paragrafo 1o-A do art. 7o do Convenio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularizacao de erro ocorrido na emissao de documento fiscal, desde que o erro nao esteja relacionado com: I - as variaveis que determinam o valor do imposto tais como: base de calculo, aliquota, diferenca de preco, quantidade, valor da operacao ou da prestacao; II - a correcao de dados cadastrais que implique mudanca do remetente ou do destinatario; III - a data de emissao ou de saida."
},
"protocolo_carta_correcao": {
"versao": "1.00",
"ambiente": "2",
"versao_aplicativo": "PR-v3_8_7",
"codigo_orgao": "41",
"status": "135",
"motivo": "Evento registrado e vinculado a NF-e",
"chave_nfe": "91180177643353000172550030000000251381549464",
"tipo_evento": "110110",
"descricao_evento": "Carta de Correção",
"data_evento": "2012-01-17T15:59:37-02:00",
"numero_protocolo": "141180000026777"
}
}
Download do XML da NFCe
Após a autorização da nota fiscal de consumidor eletrônica será disponibilizado os campos:
caminho_xml_nota_fiscal - Representa o caminho para montar a URL para download do XML. Por exemplo, se você utilizou o ambiente de produção (https://api.focusnfe.com.br) e o caminho_xml_nota_fiscal contém o caminho "/arquivos/733530172/201704/XMLs/41170777627353999172550010000003871980884091-nfe.xml" você poderá acessar o XML pela URL completa https://api.focusnfe.com.br/arquivos/733530172/201704/XMLs/41170777627353999172550010000003871980884091-nfe.xml
Utilize o método HTTP GET para essa consulta.
Existe obrigatoriedade legal para armazenar o XML de todas as notas NFCe (modelo 65) por pelo menos 5 anos após a data de autorização da nota. Nossa API faz a guarda automática dos arquivos por esse período.
Exemplos de respostas da API por status para a requisição de consulta:
autorizado
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899",
"status": "autorizado",
"status_sefaz": "100",
"mensagem_sefaz": "Autorizado o uso da NF-e",
"chave_nfe": "NFe41190607504505000132650010000000121743484310",
"numero": "12",
"serie": "1",
"caminho_xml_nota_fiscal": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132650010000000121743484310-nfe.xml",
"caminho_danfe": "/notas_fiscais_consumidor/NFe41190607504505000132650010000000121743484310.html",
"qrcode_url": "http://www.fazenda.pr.gov.br/nfce/qrcode/?p=41190607504505000132650010000000121743484310|2|2|1|5E264C0E28D801197219894CDFCF2FCCC5237F08",
"url_consulta_nf": "http://www.fazenda.pr.gov.br/nfce/consulta"
}
erro_autorizacao
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_0008992",
"status": "erro_autorizacao",
"status_sefaz": "591",
"mensagem_sefaz": "Informado CSOSN para emissor que nao e do Simples Nacional (CRT diferente de 1). [nItem:1]"
}
cancelado
{
"cnpj_emitente": "07504505000132",
"ref": "referencia_000899",
"status": "cancelado",
"status_sefaz": "135",
"mensagem_sefaz": "Evento registrado e vinculado a NF-e",
"numero": "12",
"serie": "1",
"chave_nfe": "NFe41190607504505000132650010000000121743484310",
"caminho_xml_nota_fiscal": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132650010000000121743484310-nfe.xml",
"caminho_xml_cancelamento": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132650010000000121743484310-can.xml"
}
Cancelamento
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfce/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
justificativa={}
justificativa["justificativa"] = "Sua justificativa aqui!"
r = requests.delete(url+ref, data=json.dumps(justificativa), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
-X DELETE -d '{"justificativa":"Teste de cancelamento de nota"}' \
https://homologacao.focusnfe.com.br/v2/nfce/12345
import java.util.HashMap;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFCeCancelamento {
public static void main(String[] args){
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfce/"+ref);
/* Aqui criamos um hashmap para receber a chave "justificativa" e o valor desejado. */
HashMap<String, String> justificativa = new HashMap<String, String>();
justificativa.put("justificativa", "Informe aqui a sua justificativa para realizar o cancelamento da NFCe.");
/* Criamos um objeto JSON para receber a hash com os dados esperado pela API. */
JSONObject json = new JSONObject(justificativa);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.delete(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfce/" + ref
# altere os campos conforme a nota que será enviada
justificativa_cancelamento = {
justificativa: "Informe aqui a sua justificativa para realizar o cancelamento da NFCe."
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Delete a partir da uri de requisição
requisicao = Net::HTTP::Delete.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos a hash de justificativa do cancelamento para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = justificativa_cancelamento.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$justificativa = array ("justificativa" => "Teste de cancelamento de nota");
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server . "/v2/nfce/" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($justificativa));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$result = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfe/"+ ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('DELETE', url, false, token);
var cancelar = {
"justificativa": "Sua justificativa aqui!"
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(cancelar));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Para cancelar uma NFCe, basta fazer uma requisição à URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Cancelar uma NFCe já autorizada:
https://api.focusnfe.com.br/v2/nfce/REFERENCIA
Utilize o comando HTTP DELETE para cancelar a sua nota para nossa API. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.
O parâmetro de cancelamento deverá ser enviado da seguinte forma:
- justificativa: Justificativa do cancelamento. Deverá conter de 15 a 255 caracteres.
A API irá em seguida devolver os seguintes campos:
- status: cancelado, se a nota pode ser cancelada, ou erro_cancelamento, se houve algum erro ao cancelar a nota.
- status_sefaz: O status do cancelamento na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- caminho_xml_cancelamento: Caso a nota tenha sido cancelada, será informado aqui o caminho para download do XML de cancelamento.
Prazo de cancelamento
A NFCe poderá ser cancelada em até 30 minutos após a emissão.
Exemplos de respostas da API por status para a requisição de cancelamento:
cancelado
{
"status_sefaz": "135",
"mensagem_sefaz": "Evento registrado e vinculado a NF-e",
"status": "cancelado",
"caminho_xml_cancelamento": "/arquivos_development/07504505000132/201906/XMLs/41190607504505000132650010000000121743484310-can.xml"
}
requisicao_invalida
{
"codigo": "requisicao_invalida",
"mensagem": "Parâmetro \"justificativa\" deve ter entre 15 e 255 caracteres"
}
nfe_nao_autorizada
{
"codigo": "nfe_nao_autorizada",
"mensagem": "Nota fiscal não autorizada"
}
Inutilização
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfce/inutilizacao"
token="token obtido no cadastro da empresa"
'''
Usamos dicionarios e listas para armazenar os campos e valores que em seguida,
serao convertidos em JSON e enviados para nossa API
'''
inutilizacao={}
inutilizacao["cnpj"] = "CNPJ da empresa emitente"
inutilizacao["serie"] = "Serie da numeracao da NFCe que tera uma faixa de numeracao inutilizada"
inutilizacao["numero_inicial"] = "Numero inicial a ser inutilizado"
inutilizacao["numero_final"] = "Numero final a ser inutilizado"
inutilizacao["justificativa"] = "Justificativa da inutilizacao (minimo 15 caracteres)"
r = requests.post(url, data=json.dumps(inutilizacao), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
-X POST -d '{"cnpj":"51916585009999","serie":"9","numero_inicial":"7730","numero_final":"7732","justificativa":"Teste de inutilizacao de nota"}' \
https://homologacao.focusnfe.com.br/v2/nfce/inutilizacao
import java.util.HashMap;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFCeInutilizacao {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfce/inutilizacao");
/* Aqui criamos um hash que irá receber as chaves e valores esperados para gerar a inutilização. */
HashMap<String, String> dadosInutilizacao = new HashMap<String, String>();
dadosInutilizacao.put("cnpj", "51916585009999");
dadosInutilizacao.put("serie", "9");
dadosInutilizacao.put("numero_inicial", "7730");
dadosInutilizacao.put("numero_final", "7732");
dadosInutilizacao.put("justificativa", "Informe aqui a justificativa para realizar a inutilizacao da numeracao.");
/* Criamos um objeto JSON que irá receber o input dos dados, para então enviar a requisição. */
JSONObject json = new JSONObject (dadosInutilizacao);
/* Testar se o JSON gerado está dentro do formato esperado.
System.out.print(json); */
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfce/inutilizacao"
# altere os campos conforme a nota que será enviada
dados_inutilizacao = {
cnpj: "51916585009999",
serie: "9",
numero_inicial: "7730",
numero_final: "7732",
justificativa: "Informe aqui a justificativa para realizar a inutilizacao da numeracao."
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos a hash de justificativa do cancelamento para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = dados_inutilizacao.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
$login = "token obtido no cadastro da empresa";
$password = "";
$inutiliza = array (
"cnpj" => "51916585000125",
"serie" => "1",
"numero_inicial" => "107",
"numero_final" => "109",
"justificativa" => "Teste+de+inutilizacao+de+nota"
);
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfce/inutilizacao");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($inutiliza));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfce/inutilizacao";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var inutiliza = {
"cnpj": "51916585000125",
"serie": "1",
"numero_inicial": "700",
"numero_final": "703",
"justificativa": "Teste de inutilizacao de nota"
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(inutiliza));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Em uma situação normal você não precisará informar ao SEFAZ a inutilização de um número da NFCe, pois a API controla automaticamente a numeração das notas. Porém, se por alguma situação específica for necessário a inutilização de alguma faixa de números você poderá chamar as seguintes operações:
Envio de inutilização de faixa de numeração:
https://api.focusnfe.com.br/v2/nfce/inutilizacao
Utilize o comando HTTP POST para enviar a sua inutilização para nossa API. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.
A inutilização precisa dos seguintes parâmetros obrigatórios:
- cnpj: CNPJ da empresa emitente
- serie: Série da numeração da NFCe que terá uma faixa de numeração inutilizada
- numero_inicial: Número inicial a ser inutilizado
- numero_final: Número final a ser inutilizado
- justificativa: Justificativa da inutilização (mínimo 15 caracteres)
A API irá enviar uma resposta com os seguintes campos:
- status: autorizado, se a inutilização foi aceita pela SEFAZ, ou erro_autorizacao, se houve algum erro ao inutilizar os números.
- status_sefaz: O status da carta de correção na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- serie: Série da numeração da NFCe que terá uma faixa de numeração inutilizada
- numero_inicial: Número inicial a ser inutilizado
- numero_final: Número final a ser inutilizado
- cnpj: CNPJ da empresa
- modelo: Modelo do documento (65 para NFCe)
- caminho_xml: Caminho do XML para download caso a inutilização tenha sido autorizada pela SEFAZ.
Em algumas situações em que sejam identificados erros de emissão de forma tardia, nossa API pode decidir pela inutilização de números ao invés de reutilizá-los para outras emissões. Desta forma você pode criar um gatilho (webhook) para ser notificado sempre que houver a inutilização de alguma faixa de numeração. Consulte a seção de gatilhos e utilize o evento chamado "inutilizacao".
Exemplos de respostas da API por status para a requisição de inutilização:
autorizado
{
"status_sefaz": "102",
"mensagem_sefaz": "Inutilizacao de numero homologado",
"serie": "1",
"numero_inicial": "999",
"numero_final": "1000",
"modelo": "65",
"cnpj": "1807504405000132",
"status": "autorizado",
"caminho_xml": "/arquivos_development/07504505000132/201906/XMLs/190750450500013265001000000999000001000-inu.xml"
}
erro_autorizacao
{
"status_sefaz": "241",
"mensagem_sefaz": "Um numero da faixa ja foi utilizado",
"serie": "1",
"numero_inicial": "1",
"numero_final": "9",
"status": "erro_autorizacao"
}
Reenvio de e-mail
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfce/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
emails = {}
email = "suporte@acras.com.br"
emails["emails"] = [email]
r = requests.delete(url+ref+"/email", data=json.dumps(emails), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)l
curl -u "token obtido no cadastro da empresa:" \
-X POST -d '{"emails":["alguem@example.org"]}' \
https://homologacao.focusnfe.com.br/v2/nfce/12345/email
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFCeEnviaEmail {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfce/"+ref+"/email");
/* Criamos o um objeto JSON que receberá um JSON Array com a lista de e-mails. */
JSONObject json = new JSONObject ();
JSONArray listaEmails = new JSONArray();
listaEmails.put("email_01@acras.com.br");
listaEmails.put("email_02@acras.com.br");
listaEmails.put("email_03@acras.com.br");
json.put("emails", listaEmails);
/* Testar se o JSON gerado está dentro do formato esperado.
System.out.print(json); */
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfce/" + ref + "/email"
# altere os campos conforme a nota que será enviada
emails_destinatarios = {
emails: ["email_01@acras.com.br", "email_02@acras.com.br", "email_03@acras.com.br"]
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos os dados da nota para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = emails_destinatarios.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
/* Você deve definir isso globalmente para sua aplicação.
Para ambiente de produção utilize e a variável abaixo:
$server = "https://api.focusnfe.com.br"; */
$server = "https://homologacao.focusnfe.com.br";
// Substituir a variável, ref, pela sua identificação interna de nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$email = array (
"emails" => array(
"email@email.com"
)
);
// Inicia o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfce/" . $ref . "/email");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($email));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// As próximas três linhas são um exemplo de como imprimir as informações de retorno da API.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfce/" + ref + "/email";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var email = ["email1@acras.com.br", "email2@acras.com.br", "email3@acras.com.br"];
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
var json = JSON.stringify({"emails": email});
request.send(json);
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Para cada nota autorizada, cancelada ou que tenha sido emitida uma carta de correção o destinatário da nota é notificado via email. Porém eventualmente pode ser necessário enviar a nota fiscal para outras pessoas ou mesmo reenviar o email para o mesmo destinatário.
Para enviar um ou mais emails:
https://api.focusnfe.com.br/v2/nfce/REFERENCIA/email
Utilize o comando HTTP POST para enviar os emails. Esta operação aceita apenas um parâmetro:
- emails: Array com uma lista de emails que deverão receber uma cópia da nota. Limitado a 10 emails por vez.
A API imediatamente devolve a requisição com a confirmação dos emails. Os emails serão enviados em segundo plano, por isso pode levar alguns minutos até que eles cheguem à caixa postal.
Enviador de Arquivos S@T / NFCe
Para os usuários de tecnologias que não permitem o acesso à API via Web Services ou que não desejam programar o acesso HTTP, disponibilizamos um comunicador standalone (desktop) que realiza toda comunicação com a nossa API.
Visão Geral
O Enviador de Arquivos, quando é executado, consulta o conteúdo de algumas pastas com descrições especificas que podem ser criados a partir do diretório escolhido pelo usuário, chamamos estes diretórios de 'Diretórios de Comunicação'. Desta forma, seu programa poderá apenas criar um arquivo em uma pasta específica, contendo o JSON com os dados necessários para emitir a nota. O enviador por sua vez consulta esta pasta e armazena o resultado (PDF, XML) em outra pasta para consulta.
Diretórios de Comunicação
Abaixo a descrição de cada pasta e a sua finalidade:
- envios: diretório inicial do processo de envio. O Enviador irá procurar os arquivos com extensão .nfce ou .cfe para fazer a emissão ou cancelamento.
- enviados: todos os arquivos lidos no diretório 'envios' serão movidos para este diretório.
- tmp: neste diretório é gerado um arquivo no formato XML para o envio dos dados ao aparelho S@T. Na emissão de NFCe essa etapa não acontece, pois é utilizada a nossa API de NFCe.
- processados: neste diretório o Enviador de Arquivos irá armazenar as respostas 'cruas' recebidas da Sefaz, ele irá adicionar a extensão '.resp.raw.json' nos arquivos .cfe/.cfecanc, .nfce/.canc.
- retornos: aqui é gerado um novo arquivo com a resposta da Sefaz formatada (mesmo conteúdo presente no arquivo do diretório 'processados'), porém com a extensão .cfe/.cfecanc, .nfce/.canc.
- xml: neste diretório é salvo o XML gerado pela Sefaz, tanto para CFe S@T como para NFCe (emissão e cancelamento).
- pdf: aqui é salvo a DANFCe e a impressão do CFe do S@T. Não é gerado impressão quando o documento fiscal é cancelado.
No diagrama abaixo mostramos como será o fluxo de acesso aos diretórios citados anteriormente:
Documentos Suportados
Os documentos fiscais suportados atualmente são o Cupom Fiscal Eletrônico gerado por aparelhos S@T do Estado de São Paulo e a Nota Fiscal de Consumidor Eletrônica ou NFCe que pode ser emitida em todos os Estados brasileiros, com exceção de Santa Catarina.
Para cada documento, será esperado um arquivo com formato diferente. Nele, estarão os dados da nota que serão enviados para a Sefaz do Estado.
Aparelhos integrados
De forma geral, as fabricantes costumam utilizar a mesma versão da DLL para todos os seus aparelhos S@T, com isso, alguns modelos não listados podem ser compatíveis com a versão atual do nosso Comunicador.
Marcar | Modelo |
---|---|
Tanca | TM-1000 |
Epson | SAT A10 |
Bematech | RB 2000 |
Control ID | SAT iD |
Dimep | D-SAT 2.0 |
Elgin | Linker e Smart |
Sweda | SS2000 |
Urano | SAT UR |
Entre em contato com o nosso time de Suporte para verificar a possibilidade de integrações de novos fabricantes/modelos.
CFe S@T
Para emissão dos cupons fiscais com o S@T será necessário, primeiramente, o cumprimento das premissas abaixo:
- Ter um aparelho S@T de uma marca homologada com o nosso sistema (consultar aqui).
- O S@T deve estar vinculado ao emitente na Sefaz do Estado de São Paulo.
- O aparelho deve ser atividado, conforme as orientações do fabricante.
- Configurado a Assinatura AC no aparelho S@T, através do seu respectivo software de ativação.
A partir disso, será possível utilizar o nosso Enviador. Ressaltamos que todas as etapas são importantes e, quando não cumpridas, impedem a emissão do documento fiscal.
O arquivo com os dados do CFe S@T deve seguir a estrutura de um arquivo do formato JSON, mas com a extensão .cfe (emissão) e .cfecanc (cancelamento).
Campos
Dados de exemplo (campos obrigatórios) .cfe:
{
"items": [
{
"codigo_ncm": "21069090",
"codigo_produto": "L055",
"descricao": "Descricao produto",
"quantidade": 1,
"cfop": "5102",
"valor_unitario": 0.01,
"valor_bruto": 0.01,
"unidade_comercial": "un",
"icms_situacao_tributaria": "40"
}
]
}
Dados de exemplo (campos não obrigatórios) .cfe:
{
"nome_destinatario": "ACRAS TECNOLOGIA DA INFORMACAO LTDA",
"cnpj_destinatario": "07504505000132",
"items": [
{
"codigo_ncm": "21069090",
"codigo_produto": "L055",
"descricao": "Descricao produto",
"quantidade": 1,
"cfop": "5102",
"valor_unitario": 1.00,
"valor_bruto": 1.00,
"unidade_comercial": "un",
"icms_situacao_tributaria": "40",
"icms_aliquota" : "0",
"valor_total_tributos": "0",
"pis_situacao_tributaria": "0",
"pis_aliquota_porcentual": "0",
"cofins_situacao_tributaria": "0",
"cofins_aliquota_porcentual": "0",
}
],
"forma_pagamento":[
{
"forma_pagamento": "03",
"valor_pagamento": "0.50"
},
{
"forma_pagamento": "02",
"valor_pagamento": "0.50"
}
]
}
Abaixo os campos mínimos que utilizamos para a emissão de um Cupom Fiscal Eletrônicos S@T:
Campos do grupo 'itens':
Campo | Descrição |
---|---|
codigo_ncm | código NCM do produto. |
codigo_produto | código interno do produto. |
descricao | descrição do produto. |
quantidade | quantidade do produto. |
cfop | código CFOP da operação. |
valor_unitario | valor unitário da produto. |
valor_bruto | valor bruto do produto. |
unidade_comercial | unidade de medida comercial do produto. |
icms_situacao_tributaria | código da situação tributário do ICMS. Valores possíveis: 00, 20, 40, 60, 102, 103, 300, 500 ou 900. |
Para mais detalhes sobre os valores possívels em icms_situacao_tributaria consulte nossa documentação de campos da API NFe/NFCe aqui.
Campos omitidos / não obrigatórios
Abaixo os campos respectivos ao destinatário do CFe:
Campo | Descrição |
---|---|
cnpj_destinatario | CNPJ do destinatário. Não informar se for preenchido o campo cpf_destinatario. |
cpf_destinatario | CPF do destinatário. Não informar se for preenchido o campo cnpj_destinatario. |
nome_destinatario | Nome ou Razão Social do destinatário. |
Estes campos são preenchidos automaticamente quando omitidos:
Campo | Descrição | Valor padrão |
---|---|---|
icms_aliquota | alíquota do ICMS. | 0.00 |
pis_situacao_tributaria | código da situação tributário do PIS. Valores possíveis: 01, 02, 03, 04, 05, 06, 07, 08 e 09. | 07 / 49 |
pis_aliquota_porcentual | alíquota do PIS. | 0.00 |
cofins_situacao_tributaria | código da situação tributário do COFINS. Valores possíveis: 01, 02, 03, 04, 05, 06, 07, 08 e 09. | 07 / 49 |
cofins_aliquota_porcentual | alíquota do COFINS. | 0.00 |
Campos do grupo 'formas_pagamento':
Quando omitido, será considerado a forma de pagamento dinheiro e o valor total do cupom.
Campo | Descrição |
---|---|
forma_pagamento | forma de pagamento utilizado na venda. Valores possíveis: 01, 02, 03, 04, 05, 10, 11, 12, 13 ou 99. |
valor_pagamento | valor total utilizado para essa forma de pagamento. |
Para mais detalhes sobre os valores possívels em forma_pagamento consulte nossa documentação de campos da API NFe/NFCe aqui.
Emissão
Arquivo .cfe de exemplo:
{
"items": [
{
"codigo_ncm": "21069090",
"codigo_produto": "L055",
"descricao": "Descricao produto",
"quantidade": 1,
"cfop": "5102",
"valor_unitario": 0.01,
"valor_bruto": 0.01,
"unidade_comercial": "un",
"icms_situacao_tributaria": "40"
}
]
}
O Enviador de Arquivos utiliza a descrição do arquivo no formato '.cfe' para realizar a emissão do cupom fiscal. Essa descrição nós chamamos de referência ou REF, você pode ler mais sobre ela aqui.
É importante observar que o Enviador de Arquivos não possui qualquer inteligência com relação à referência utilizada, por isso, seu sistema deve garantir a criação das REF's, de modo que nunca seja criado uma mesma referência para o mesmo emitente. Se isso acontecer, você receberá um retorno informando que a nota já foi autorizada.
Cancelamento
Arquivo .cfecanc de exemplo:
{
"chave": "77781082373077987991599000999380000289999993"
}
Arquivo .cfecanc de exemplo (quando informado o CNPJ ou CPF do destinatário):
{
"chave": "77781082373077987991599000999380000289999993",
"cnpj": "07504505000132"
}
Utilizamos a mesma referência de emissão para o cancelamento, contudo, sua extensão é alterada para .cfecanc e, em seu conteúdo, deve ser enviado a chave de acesso do Cupom Fiscal Eletrônico. Caso seja informado o documento de identificação do destinatário (CNPJ ou CPF) na emissão, o mesmo terá de ser informado no arquivo de cancelamento.
Após processado o cancelamento um arquivo com o mesmo nome será gravado no diretório "retornos" contendo um JSON simples com o resultado da operação indicando se houve sucesso ou erro.
Reimpressão do Cupom Fiscal Eletrônico
O arquivo de impressão do CFe S@T fica armazenado na pasta 'pdf', basta acessar esse diretório para realizar a reimpressão de Cupons Fiscais já emitidos.
NFCe
Para emissão da Nota Fiscal de Consumidor Eletrônica será necessário, primeiramente, o cumprimento das premissas abaixo:
- Possuir Certificado Digital modelo A1.
- Habilitar a emissão de NFCe na Sefaz do Estado do emitente.
- Gerar os códigos CSC e ID_TOKEN na Sefaz.
- Realizar o cadastro da empresa emitente em nossa base (site Focus NFe, Painel da API ou API de Revenda).
- Informar os códigos CSC e ID_TOKEN no cadastro do emitente.
- Importar o Certificado Digital através do Painel da API ou solicitar ao nosso Suporte (suporte@acras.com.br).
A partir disso, será possível utilizar o nosso Enviador. Ressaltamos que todas as etapas são importantes e, quando não cumpridas, impedem a emissão do documento fiscal.
O arquivo com os dados da NFCe deve seguir a estrutura de um arquivo do formato JSON, mas com a extensão .nfce (emissão) e .canc (cancelamento).
Campos
Os campos utilizados para emissão da NFCe são os mesmos que utilizamos em nossa API de NFCe, veja os campos obrigatórios aqui.
Abaixo os campos referentes aos dados do emitente na DANFCe:
Campo | Descrição |
---|---|
nome_emitente | nome da empresa emitente. |
cnpj_emitente | CNPJ da empresa que está emitindo a NFCe. |
telefone_emitente | telefone do emitente. |
municipio_emitente | município do emitente. |
logradouro_emitente | logradouro do emitente. |
numero_emitente | numero do logradouro do emitente. |
bairro_emitente | bairro do emitente |
cep_emitente | CEP do emitente. |
uf_emitente | UF do Estado do emitente. |
Emissão
Arquivo .nfce de exemplo:
{
"nome_emitente": "ACME LTDA",
"cnpj_emitente": "51916585000125",
"telefone_emitente": "4139995050",
"municipio_emitente": "Ponta Grossa",
"logradouro_emitente": "Av. XV de Novembro",
"numero_emitente": "12343",
"bairro_emitente": "Centro",
"cep_emitente": "84015500",
"uf_emitente": "PR",
"valor_total": "1.00",
"valor_troco": "4.00",
"data_emissao": "2020-03-26T10:47:00-0300",
"cpf_destinatario" : "",
"cnpj_destinatario" : "",
"nome_destinatario": "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"indicador_inscricao_estadual_destinatario": "9",
"modalidade_frete": "9",
"local_destino":"1",
"presenca_comprador":"1",
"formas_pagamento": [
{
"forma_pagamento": "01",
"valor_pagamento": "5.00"
}
],
"items": [
{
"codigo_produto": "0007",
"numero_item": "1",
"codigo_ncm":"62044200",
"cfop":"5102",
"icms_origem":"0",
"icms_situacao_tributaria":"102",
"descricao": "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"quantidade_comercial": "1.00",
"unidade_comercial": "UN",
"valor_unitario_comercial": "1.00"
}
]
}
O Enviador de Arquivos utiliza a descrição do arquivo no formato '.nfce' para realizar a emissão da Nota Fiscal de Consumidor. Essa descrição nós chamamos de referência ou REF, você pode ler mais sobre ela aqui.
É importante observar que o Enviador de Arquivos não possui qualquer inteligência com relação à referência utilizada, por isso, seu sistema deve garantir a criação das REF's, de modo que nunca seja criado uma mesma referência para o mesmo emitente. Se isso acontecer, você receberá um retorno informando que a nota já foi autorizada.
Cancelamento
Utilizamos a mesma referência de emissão para o cancelamento, contudo, sua extensão é alterada para .canc e, em seu conteúdo, deve ser enviado a justificativa do cancelamento da nota contendo de 15 à 200 caracteres.
Após processado o cancelamento um arquivo com o mesmo nome será gravado no diretório "retornos" contendo um JSON simples com o resultado da operação indicando se houve sucesso ou erro.
Arquivo de cancelamento da NFCe .canc:
{
"justificativa": "Motivo por solicitar o cancelamento da sua NFCe."
}
Reimpressão da DANFCe
O arquivo de impressão da NFCe fica armazenado na pasta 'pdf', basta acessar esse diretório para realizar a reimpressão de uma nota já emitida.
Outra forma de realizar este processo é criar um arquivo sem conteúdo com a mesma descrição (REF) usada na emissão da nota, com o acréscimo do sufixo "_nfce", e com a extensão de arquivo .reimp.. Ele deverá ser colocado no diretório 'envios', com isso, o Enviador irá fazer uma chamada na impressora configurada enviando a DANFCe para impressão.
CFe MFe
Para emissão do Cupom Fiscal Eletrônico no estado do Ceará será necessário, primeiramente, o cumprimento das premissas abaixo:
- Seguir as instruções da seção de 'contribuinte' presentes no documento 'Manual do Portal CFe destinado aos Contribuintes - Software Houses - Consumidor Final', que pode ser encontrado aqui, ou acessando a área de downloads no Portal da Sefaz do Ceará.
- Possuir acesso a área restrita do contribuinte no Portal da Sefaz do Ceará.
- Vincular o equipamento MFe (Módulo Fiscal Eletrônico) ao CNPJ do contribuinte e assinar o 'Termo de Aceite e Requisição de Certificado Digital da SEFAZ-CE' na área restrita do contribuinte.
- Solicitar para o suporte a vinculação do CNPJ do contribuinte com o Aplicativo Comercial (Comunicador Focus NFe).
Após a vinculação do Comunicador Focus NFe com o CNPJ do Contribuinte, o funcionamento do processo, assim como os campos utilizados, segue os mesmos padrões descritos na seção CFe S@T.
API Local (beta)
# Consultar status
curl -XGET -T http://localhost:55555/fiscal/sat/status
Exemplo de resposta da API local após consultar o status do equipamento:
{
"status": "autorizado",
"codigo_sat": "08000",
"mensagem": "SAT em operação",
"mensagem_sefaz": "",
"numero_sessao": "768630",
"raw_response": [] # Resposta sem tratamento retornada pelo equipamento.
}
# Extrair logs
curl -XGET -T http://localhost:55555/fiscal/sat/logs
Exemplo de resposta da API local após extrair os logs do equipamento:
{
"status": "autorizado",
"codigo_sat": "15000",
"mensagem_sefaz": "",
"arquivo_log_base64": "...", # String em base64 contendo os logs retornados pelo equipamento
"raw_response": [] # Resposta sem tratamento retornada pelo equipamento.
}
curl -XPOST --header 'Content-Type: application/json' http://localhost:55555/fiscal/sat/ -T arquivo.json
Exemplo de resposta da API local após emissão do cupom fiscal pelo equipamento SAT/MFe:
{
"status": "autorizado",
"mensagem": "Emitido com sucesso + conteudo notas.",
"cpf_cnpj_emitente": "",
"chave_cfe": "CFe77781082373077987991599000999380000289999993",
"numero": "123",
"arquivo_cfe_base64": "...", # String em base64 contento o xml do cupom fiscal retornado pelo equipamento.
"data_emissao": "20200824185237",
"valor_total_cfe": "10.99",
"arquivo_cfe_pdf_base64": "...", # String em base64 contento o pdf do cupom fiscal.
}
curl -XDELETE --header 'Content-Type: application/json' http://localhost:55555/fiscal/sat/ -T arquivo.json
Exemplo de resposta da API local após cancelamento do cupom fiscal pelo equipamento SAT/MFe:
{
"status": "cancelado",
"mensagem": "Cupom cancelado com sucesso + conteudo CF-E-SAT cancelado.",
"cpf_cnpj_emitente": "",
"chave_cfe": "CFe77781082373077987991599000999380000289991234",
"numero": "001754",
"arquivo_cfe_base64": "...", # String em base64 contento o xml do cupom fiscal retornado pelo equipamento.
"data_emissao": "20200824185237",
"valor_total_cfe": "10.99",
"arquivo_cfe_pdf_base64": ""
}
Além do sistema de comunicação via diretórios, o Comunicador Focus NFe também disponibiliza uma API local para comunicação direta. Através da API Local é possível:
- Verificar o status do equipamento (SAT/MFe).
- Extrair os logs do equipamento (SAT/MFe).
- Emissão do cupom fiscal (SAT/MFe).
- Cancalemento do cupom fiscal (SAT/MFe).
URLs
Método | URL (recurso) | Ação |
---|---|---|
GET | http://localhost:PORTA/fiscal/sat/status | Retorna o status do equipamento. |
GET | http://localhost:PORTA/fiscal/sat/logs | Extrai os logs do equipamento. |
POST | http://localhost:PORTA/fiscal/sat/ | Emite um cupom fiscal eletrônico. |
DELETE | http://localhost:PORTA/fiscal/sat/ | Cancela um cupom fiscal eletrônico. |
- Obs 1: A valor de 'PORTA' é definido nas configurações do Comunicador Focus NFe. Caso não seja atribuído um número válido, será escolhido um valor de porta aleatório válido.
- Obs 2: O body das requisições para emissão do cupom fiscal e para o cancelamento segue exatamente o mesmo padrão utilizado nos arquivos '.cfe' e '.cfecanc' exemplificados anteriormente.
Consultar Status
A consulta de status retorna o status do equipamento SAT/MFe conectado no computador do usuário. O modelo do equipamento e o código de ativação devem ser devidamente configurados no Comunicador Focus NFe para o correto funcionamento da consulta.
Extrair logs
A extração dos logs retorna os logs do equipamento SAT/MFe conectado no computador do usuário. Devido ao tamanho do arquivo, os dados são retornados em base64.
Emitir cupom fiscal
A emissão de um cupom retorna um json com os detalhes da autorização feita pelo equipamento SAT/MFe conectado no computador do usuário. Os arquivos xmls gerados, assim como o pdf são retornados em base64.
Cancelar cupom fiscal
O cancelamento de um cupom retorna um json com os detalhes do cancelamento feito pelo equipamento SAT/MFe conectado no computador do usuário. Os arquivos xmls gerados são retornados em base64.
Download
Para te acesso ao instalador do Enviador de Arquivos, entre em contato com a nossa equipe no email comercial@acras.com.br.
NFSe
Através da API NFSe é possível:
- Emitir NFSe para qualquer município utilizando um único modelo de dados. Este processo é assíncrono. Ou seja, após a emissão a nota será enfileirada para processamento.
- Cancelar NFSe
- Consultar NFSe’s emitidas
- Encaminhar uma NFSe autorizada por email
URLs
Método | URL (recurso) | Ação |
---|---|---|
POST | /v2/nfse?ref=REFERENCIA | Cria uma nota fiscal e a envia para processamento. |
GET | /v2/nfse/REFERENCIA | Consulta a nota fiscal com a referência informada e o seu status de processamento |
DELETE | /v2/nfse/REFERENCIA | Cancela uma nota fiscal com a referência informada |
POST | /v2/nfse/REFERENCIA/email | Envia um email com uma cópia da nota fiscal com a referência informada |
Campos
Cada prefeitura pode utilizar um formato diferente de XML, mas utilizando nossa API você utiliza um formato único de campos para todas as prefeituras. A listagem dos campos segue abaixo.
Geral
Exemplo de um arquivo JSON:
{
"data_emissao":"2017-09-21T22:15:00",
"prestador":{
"cnpj":"18765499000199",
"inscricao_municipal":"12345",
"codigo_municipio":"3516200"
},
"tomador":{
"cnpj":"07504505000132",
"razao_social":"Acras Tecnologia da Informação LTDA",
"email":"contato@acras.com.br",
"endereco":{
"logradouro":"Rua Dias da Rocha Filho",
"numero":"999",
"complemento":"Prédio 04 - Sala 34C",
"bairro":"Alto da XV",
"codigo_municipio":"4106902",
"uf":"PR",
"cep":"80045165"
}
},
"servico":{
"aliquota":3,
"discriminacao":"Nota fiscal referente a serviços prestados",
"iss_retido":"false",
"item_lista_servico":"0107",
"codigo_tributario_municipio": "620910000",
"valor_servicos":1.0
}
}
- data_emissao(*): (Data) Data/hora de emissão da NFSe. Alguns municípios como São Paulo não utilizam hora e ela será descartada caso seja fornecida. Formato padrão ISO, exemplo: “2016-12-25T12:00-0300”.
- natureza_operacao(*): (String) Natureza da operação. Informar um dos códigos abaixo. Valor padrão: 1. Campo ignorado para o município de São Paulo.
- 1: Tributação no município;
- 2: Tributação fora do município;
- 3: Isenção;
- 4: Imune;
- 5: Exigibilidade suspensa por decisão judicial;
- 6: Exigibilidade suspensa por procedimento administrativo.
- regime_especial_tributacao: (String) Informar o código de identificação do regime especial de tributação conforme abaixo. Campo ignorado para o município de São Paulo.
- 1: Microempresa municipal;
- 2: Estimativa;
- 3: Sociedade de profissionais;
- 4: Cooperativa;
- 5: MEI - Simples Nacional;
- 6: ME EPP- Simples Nacional.
- optante_simples_nacional(*): (Boolean) Informar verdadeiro ou falso se a empresa for optante pelo Simples Nacional. Campo ignorado pelo município de São Paulo.
- incentivador_cultural: (Boolean) Informe verdadeiro ou falso. Valor padrão: falso. Campo ignorado para o município de São Paulo.
- tributacao_rps: (String) Usado apenas pelo município de São Paulo. Informe o tipo de tributação:
- T: Tributado em São Paulo;
- F: Tributado Fora de São Paulo;
- A: Tributado em São Paulo, porém Isento;
- B: Tributado Fora de São Paulo, porém Isento;
- M: Tributado em São Paulo, porém Imune;
- N: Tributado Fora de São Paulo, porém Imune;
- X: Tributado em São Paulo, porém Exigibilidade Suspensa;
- V: Tributado Fora de São Paulo, porém Exigibilidade Suspensa;
- P: Exportação de Serviços.
- codigo_obra: (String) Código da obra quando construção civil. Tamanho: 15 caracteres.
- art: (String) Código ART quando construção civil. Este campo é ignorado pelo município de São Paulo. Tamanho: 15 caracteres.
- numero_rps_substituido: (String) Caso o município permita a substituição de notas, aqui você poderá informar o número do RPS que será substituído. Municípios que seguem o padrão ABRASF poderão usar esta operação.
- serie_rps_substituido: (String) Obrigatório se informado o campo numero_rps_substituido. Indica a série do RPS a ser substituído.
- tipo_rps_substituido: (String) Obrigatório se informado o campo numero_rps_substituido. Indica o tipo do RPS a ser substituído. Caso desconheça este valor, utiliza o valor "1".
Prestador
- prestador:
- cnpj(*): (String). CNPJ do prestador de serviços. Caracteres não numéricos são ignorados.
- codigo_municipio(*): (String). Código IBGE de 7 dígitos do município do prestador.
- inscricao_municipal(*): (String). Inscrição municipal do prestador de serviços. Caracteres não numéricos são ignorados.
Tomador
- tomador:
- cpf(*): (String) CPF do tomador, se aplicável. Caracteres não numéricos são ignorados.
- cnpj(*): (String) CNPJ do tomador, se aplicável. Caracteres não numéricos são ignorados.
- inscricao_municipal: (String) Inscrição municipal do tomador. Caracteres não numéricos são ignorados.
- razao_social: (String) Razão social ou nome do tomador. Tamanho: 115 caracteres.
- telefone: (String) Telefone do tomador. Campo ignorado para o município de São Paulo. Tamanho: 11 caracteres.
- email: (String) Email do tomador. Tamanho: 80 caracteres.
- endereco:
- logradouro: (String) Nome do logradouro. Tamanho: 125 caracteres.
- tipo_logradouro: (String) Tipo do logradouro. Usado apenas para o município de São Paulo. Valor padrão: os 3 primeiros caracteres do logradouro. Tamanho: 3 caracteres.
- numero: (String) Número do endereço. Tamanho: 10 caracteres.
- complemento: (String) Complemento do endereço. Tamanho: 60 caracteres.
- bairro: Bairro. (String) Tamanho: 60 caracteres.
- codigo_municipio: (String) Código IBGE do município.
- uf: (String) UF do endereço. Tamanho: 2 caracteres.
- cep: (String) CEP do endereço. Caracteres não numéricos são ignorados.
Serviço
- servico:
- valor_servicos(*): (Decimal) Valor dos serviços.
- valor_deducoes: (Decimal) Valor das deduções.
- valor_pis: (Decimal) Valor do PIS.
- valor_cofins: (Decimal) Valor do COFINS.
- valor_inss: (Decimal) Valor do INSS.
- valor_ir: (Decimal) Valor do IRRF.
- valor_csll: (Decimal) Valor do CSLL
- iss_retido(*): (Boolean) Informar verdadeiro ou falso se o ISS foi retido.
- valor_iss: (Decimal) Valor do ISS. Campo ignorado pelo município de São Paulo.
- valor_iss_retido: (Decimal) Valor do ISS Retido. Campo ignorado pelo município de São Paulo.
- outras_retencoes: (Decimal) Valor de outras retenções. Campo ignorado pelo município de São Paulo.
- base_calculo: (Decimal) Base de cálculo do ISS, valor padrão igual ao valor_servicos. Campo ignorado pelo município de São Paulo.
- aliquota: (Decimal) Aliquota do ISS. Algumas cidades permitem usar 4 dígitos decimais.
- desconto_incondicionado: (Decimal) Valor do desconto incondicionado. Campo ignorado pelo município de São Paulo.
- desconto_condicionado: (Decimal) Valor do desconto condicionado. Campo ignorado pelo município de São Paulo.
- item_lista_servico(*): (String) Informar o código da lista de serviços, de acordo com a Lei Complementar 116/2003. Utilize outra tabela para o município de São Paulo.
- codigo_cnae: (String) Informar o código CNAE de 7 dígitos. Campo ignorado pelo município de São Paulo.
- codigo_tributario_municipio: (String) Informar o código tributário de acordo com a tabela de cada município (não há um padrão). Campo ignorado pelo município de São Paulo.
- discriminacao(*): (String) Discriminação dos serviços. Tamanho: 2000 caracteres.
- codigo_municipio(*): (String) Informar o código IBGE de 7 dígitos do município de prestação do serviço.
- percentual_total_tributos: (Decimal) Percentual aproximado de todos os impostos, de acordo com a Lei da Transparência. No momento disponível apenas para São Paulo.
- fonte_total_tributos: (String) Fonte de onde foi retirada a informação de total de impostos, por exemplo, “IBPT”. No momento disponível apenas para São Paulo.
Intermediário
- intermediario (esta seção é ignorada pelo município de São Paulo)
- razao_social: (String) Razão social do intermediário do serviço. Tamanho: 115 caracteres.
- cpf: (String) CPF do intermediário do serviço, se aplicável. Caracteres não numéricos são ignorados.
- cnpj: (String) CNPJ do intermediário do serviço, se aplicável. Caracteres não numéricos são ignorados.
- inscricao_municipal: (String) Inscrição municipal do intermediário do serviço, se aplicável. Caracteres não numéricos são ignorados.
Alguns municípios podem ter campos adicionais ou algumas regras específicas para preenchimento de campos. Uma boa prática é consultar a nossa lista de municípios atendidos e ver se existe algum artigo escrito sobre especificidades do seu município.
Status API
Aqui você encontra os status possíveis para NFSe.
HTTP CODE/STATUS | Status API Focus | Descrição | Correção |
---|---|---|---|
404 - not found | nao_encontrado | Nota fiscal não encontrada | Verifique o método utilizado (deve-se usar POST) ou a nota fiscal não foi encontrada. |
400 - bad request | nfe_cancelada | Nota fiscal já cancelada | Não é possível realizar a operação solicitada, pois a nota fiscal já foi cancelada. |
400 - bad request | nfe_nao_autorizada | Nota fiscal não autorizada não pode ser cancelada | O cancelamento só é possível para NFSe's autorizadas. |
400 - bad request | requisicao_invalida | Sua requisição é inválida porque alguns dos paramêtros básicos não foram cumpridos. Consulte a nossa documentação. | |
400 - bad request | empresa_nao_habilitada | Emitente ainda não habilitado para emissão de NFSe | Configure a emissão de NFSe através do Painel API e tente novamente. |
400 - bad request | certificado_vencido | O certificado do emitente está vencido | É necessário renovar ou adquirir um novo certificado digital modelo A1. |
422 - unprocessable entity | nfe_autorizada | Nota fiscal já autorizada | A operação solicitada não pode ser realizada, pois a NFSe já foi autorizada. |
422 - unprocessable entity | em_processamento | Nota fiscal em processamento | Sua nota está sendo processada pela prefeitura, aguarde alguns minutos antes de consultá-la novamente. |
Envio
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfse"
# Substituir pela sua identificação interna da nota
ref = {"ref":"12345"}
token="token obtido no cadastro da empresa"
'''
Usamos dicionarios para armazenar os campos e valores que em seguida,
serao convertidos em JSON e enviados para nossa API
'''
nfse = {}
nfse["prestador"] = {}
nfse["servico"] = {}
nfse["tomador"] = {}
nfse["tomador"]["endereco"] = {}
nfse["razao_social"] = "ACME INK"
nfse["data_emissao"] = "2018-02-26T12:00:00-03:00"
nfse["incentivador_cultural"] = "false"
nfse["natureza_operacao"] = "1"
nfse["optante_simples_nacional"] = "true"
nfse["status"] = "1"
nfse["prestador"]["cnpj"] = "99999999999999"
nfse["prestador"]["inscricao_municipal"] = "99999999"
nfse["prestador"]["codigo_municipio"] = "9999999"
nfse["servico"]["aliquota"] = "2.92"
nfse["servico"]["base_calculo"] = "1.00"
nfse["servico"]["discriminacao"] = "SERVICOS E MAO DE OBRA"
nfse["servico"]["iss_retido"] = "0"
nfse["servico"]["item_lista_servico"] = "1412"
nfse["servico"]["valor_iss"] = "11.68"
nfse["servico"]["valor_liquido"] = "1.00"
nfse["servico"]["valor_servicos"] = "1.00"
nfse["tomador"]["cnpj"] = "99999999999999"
nfse["tomador"]["razao_social"] = "Parkinson da silva coelho JR"
nfse["tomador"]["endereco"]["bairro"] = "São Miriti"
nfse["tomador"]["endereco"]["cep"] = "31999-000"
nfse["tomador"]["endereco"]["codigo_municipio"] = "9999999"
nfse["tomador"]["endereco"]["logradouro"] = "João Batista Netos"
nfse["tomador"]["endereco"]["numero"] = "34"
nfse["tomador"]["endereco"]["uf"] = "MG"
#print (json.dumps(nfse))
r = requests.post(url, params=ref, data=json.dumps(nfse), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
# arquivo.json deve conter os dados da NFSe
curl -u "token obtido no cadastro da empresa:" \
-X POST -T arquivo.json https://homologacao.focusnfe.com.br/v2/nfse
import java.util.HashMap;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFSeAutorizar {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfse?ref="+ref);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
/* Aqui são criados as hash's que receberão os dados da nota. */
HashMap<String, String> nfse = new HashMap<String, String>();
HashMap<String, String> prestador = new HashMap<String, String>();
HashMap<String, String> tomador = new HashMap<String, String>();
HashMap<String, String> tomadorEndereco = new HashMap<String, String>();
HashMap<String, String> servico = new HashMap<String, String>();
nfse.put("data_emissao", "2018-01-15T17:40:00");
nfse.put("natureza_operacao", "1");
prestador.put("cnpj", "51916585000125");
prestador.put("inscricao_municipal", "123456");
prestador.put("codigo_municipio", "4128104");
tomador.put("cpf", "51966818092");
tomador.put("razao_social", "ACME LTDA");
tomador.put("email", "email-do-tomador@google.com.br");
tomadorEndereco.put("bairro", "Jardim America");
tomadorEndereco.put("cep", "82620150");
tomadorEndereco.put("codigo_municipio", "4106902");
tomadorEndereco.put("logradouro", "Rua Paulo Centrone");
tomadorEndereco.put("numero", "168");
tomadorEndereco.put("uf", "PR");
servico.put("discriminacao", "Teste de servico");
servico.put("aliquota", "3.00");
servico.put("base_calculo", "1.0");
servico.put("valor_iss", "0");
servico.put("iss_retido", "false");
servico.put("codigo_tributario_municipio", "080101");
servico.put("item_lista_servico", "0801");
servico.put("valor_servicos", "1.0");
servico.put("valor_liquido", "1.0");
/* Depois de fazer o input dos dados, são criados os objetos JSON já com os valores das hash's. */
JSONObject json = new JSONObject (nfse);
JSONObject jsonPrestador = new JSONObject (prestador);
JSONObject jsonTomador = new JSONObject (tomador);
JSONObject jsonTomadorEndereco = new JSONObject (tomadorEndereco);
JSONObject jsonServico = new JSONObject (servico);
/* Aqui adicionamos os objetos JSON nos campos da API como array no JSON principal. */
json.accumulate("prestador", jsonPrestador);
json.accumulate("tomador", jsonTomador);
jsonTomador.accumulate("endereco", jsonTomadorEndereco);
json.accumulate("servico", jsonServico);
/* É recomendado verificar como os dados foram gerados em JSON e se ele está seguindo a estrutura especificada em nossa documentação.
System.out.print(json); */
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas a seguir exibem as informações retornadas pela nossa API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfse?ref=" + ref
# altere os campos conforme a nota que será enviada
dados_da_nota = {
data_emissao: "2017-09-21T22:15:00",
prestador: {
cnpj: "18765499000199",
inscricao_municipal: "12345",
codigo_municipio: "3516200"
},
tomador: {
cnpj: "07504505000132",
razao_social: "Acras Tecnologia da Informação LTDA",
email: "contatoacras.com.br",
endereco: {
logradouro: "Rua Dias da Rocha Filho",
numero: "999",
complemento: "Prédio 04 - Sala 34C",
bairro: "Alto da XV",
codigo_municipio: "4106902",
uf: "PR",
cep: "80045165"
}
},
servico: {
aliquota: 3,
discriminacao: "Nota fiscal referente a serviços prestados",
iss_retido: "false",
item_lista_servico: "0107",
codigo_tributario_municipio: "620910000",
valor_servicos: 1.0
}
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos os dados da nota para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = dados_da_nota.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
// Você deve definir isso globalmente para sua aplicação
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br";
// Substituir pela sua identificação interna da nota
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$nfse = array (
"data_emissao" => "2017-12-27T17:43:14-3:00",
"incentivador_cultural" => "false",
"natureza_operacao" => "1",
"optante_simples_nacional" => "false",
"prestador" => array(
"cnpj" => "51916585000125",
"inscricao_municipal" => "12345",
"codigo_municipio" => "4119905"
),
"tomador" => array(
"cnpj" => "07504505000132",
"razao_social" => "Acras Tecnologia da Informação LTDA",
"email" => "contato@acras.com.br",
"endereco" => array(
"bairro" => "Jardim America",
"cep" => "81530900",
"codigo_municipio" => "4119905",
"logradouro" => "Rua ABC",
"numero" => "16",
"uf" => "PR"
)
),
"servico" => array(
"discriminacao" => "Exemplo Servi\u00e7o",
"iss_retido" => "false",
"item_lista_servico" => "106",
"codigo_cnae" => "6319400",
"valor_servicos" => "1.00"
),
);
// Inicia o processo de envio das informações usando o cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfse?ref=" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($nfse));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//as três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema deverá
//interpretar e lidar com o retorno
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfse?ref=" + ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var nfse = {
"data_emissao":"2018-03-21",
"prestador":{
"cnpj":"51916585000125",
"inscricao_municipal":"12345",
"codigo_municipio":"3518800"
},
"tomador":{
"cnpj":"07504505000132",
"razao_social":"Acras Tecnologia da Informacao LTDA",
"email":"contato@acras.com.br",
"endereco":{
"logradouro":"Rua Filho da Rocha Bage",
"numero":"750",
"complemento":"Sala 07",
"bairro":"Alto da Rua XV",
"codigo_municipio":"4106902",
"uf":"PR",
"cep":"80045165"
}
},
"servico":{
"aliquota":3,
"discriminacao":"Nota fiscal referente a servicos prestados",
"iss_retido":"false",
"item_lista_servico":"1401",
"codigo_tributario_municipio": "452000100",
"valor_servicos":1.0
}
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(nfse));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Exemplos de respostas da API por status para a requisição de envio:
processando_autorizacao (requisição enviada com sucesso para API)
{
"cnpj_prestador": "CNPJ_PRESTADOR",
"ref": "REFERENCIA",
"status": "processando_autorizacao"
}
requisicao_invalida (requisição com campos faltantes/erro de estrutura no JSON)
{
"codigo": "requisicao_invalida",
"mensagem": "Parâmetro \"prestador.codigo_municipio\" não informado"
}
Para enviar uma NFSe utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Envia uma NFSe para autorização:
https://api.focusnfe.com.br/v2/nfse?ref=REFERENCIA
Utilize o comando HTTP POST para enviar a sua nota para nossa API.
Nesta etapa, é feita uma primeira validação dos dados da nota. Caso ocorra algum problema, por exemplo, algum campo faltante, formato incorreto ou algum problema com o prestador a nota não será aceita para processamento e será devolvida a mensagem de erro apropriada. Veja a seção erros.
Caso a nota seja validada corretamente, a nota será aceita para processamento. Isto significa que a nota irá para uma fila de processamento onde eventualmente será processada (processamento assíncrono). Com isto, a nota poderá ser autorizada ou ocorrer um erro na autorização de acordo com a validação da prefeitura.
Para verificar se a nota já foi autorizada, você terá que efetuar uma consulta ou se utilizar de gatilhos.
Consulta
# Faça o download e instalação da biblioteca requests, através do python-pip.
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfse/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
r = requests.get(url+ref, params=completa, auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
https://homologacao.focusnfe.com.br/v2/nfse/12345
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFSeConsulta {
public static void main(String[] args){
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfse/"+ref);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = (ClientResponse) request.get(ClientResponse.class);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfse/" + ref
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Get a partir da uri de requisição
requisicao = Net::HTTP::Get.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
// Você deve definir isso globalmente para sua aplicação
//Substituir pela sua identificação interna da nota
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br"; // Servidor de homologação
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfse/" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//as três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema deverá
//interpretar e lidar com o retorno
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfse/" + ref + "?completa=0";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('GET', url, false, token);
request.send();
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Exemplos de respostas da API por status para a requisição de consulta:
autorizado
{
"cnpj_prestador": "07504505000132",
"ref": "nfs-2",
"numero_rps": "224",
"serie_rps": "1",
"status": "autorizado",
"numero": "233",
"codigo_verificacao": "DU1M-M2Y",
"data_emissao": "2019-05-27T00:00:00-03:00",
"url": "https://200.189.192.82/PilotoNota_Portal/Default.aspx?doc=07504505000132&num=233&cod=DUMMY",
"caminho_xml_nota_fiscal": "/notas_fiscais_servico/NFSe075045050001324106902-004949940-433-DUMMY.xml"
}
cancelado
{
"cnpj_prestador": "07504505000132",
"ref": "nfs-2",
"numero_rps": "224",
"serie_rps": "1",
"status": "cancelado",
"numero": "233",
"codigo_verificacao": "DU1M-M2Y",
"data_emissao": "2019-05-27T00:00:00-03:00",
"url": "https://200.189.192.82/PilotoNota_Portal/Default.aspx?doc=07504505000132&num=233&cod=DUMMY",
"caminho_xml_nota_fiscal": "/notas_fiscais_servico/NFSe075045050001324106902-004949940-433-DUMMY.xml"
}
erro_autorizacao
{
"cnpj_prestador": "07504505000132",
"ref": "nfs-2",
"numero_rps": "224",
"serie_rps": "1",
"status": "erro_autorizacao",
"erros": [
{
"codigo": "E145",
"mensagem": "Regime Especial de Tributação ausente/inválido.",
"correcao": null
}
]
}
processando_autorizacao
{
"cnpj_prestador": "07504505000132",
"ref": "nfs-2",
"numero_rps": "224",
"serie_rps": "1",
"status": "processando_autorizacao",
}
Após emitir uma nota, você poderá usar a operação de consulta para verificar se a nota já foi aceita para processamento, se está ainda em processamento ou se a nota já foi processada.
Para consultar uma NFSe utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Recupera informações sobre a NFSe:
https://api.focusnfe.com.br/v2/nfse/REFERENCIA
Utilize o comando HTTP GET para consultar a sua nota para nossa API.
- status: Indica a etapa do processamento interno da nota fiscal (API Focus NFe e/ou Prefeitura), podendo ser:
- autorizado: A NFSe foi autorizada com sucesso, neste caso, é fornecido os caminhos para acessar a DANFSe e XML.
- cancelado: Indica que a operação de cancelamento do documento foi realizada com sucesso.
- erro_autorizacao: Houve algum erro durante a emissão da NFSe. A mensagem de erro você encontrará dentro do campo "erros". É possível reenviar a nota com a mesma referência após realizar as correções indicadas.
- processando_autorizacao: A NFSe está sendo processada internamente (API Focus NFe) e/ou pela prefeitura, consulte após alguns minutos.
- substituido: Este documento foi substituído por outra NFSe. Consulte o campo numero_nfse_substituta.
- cnpj_prestador: O CNPJ emitente da nota fiscal (conhecido também como "prestador do serviço").
- ref: Essa é a referência usada na sua requisição.
- numero_rps: Número do RPS de controle da Prefeitura.
- serie_rps: A série do RPS de controle da Prefeitura.
- tipo_rps: O tipo do RPS de controle da Prefeitura.
- erros: Quando ocorrerem erros na emissão, será aqui que mostraremos a orientação da Prefeitura.
- url: URL para acesso do espelho da nota. Quando a prefeitura disponibiliza uma URL pública, utilizamos o link da própria prefeitura, caso contrário criamos o nosso próprio espelho através de um link interno.
- url_danfse: URL para acesso e download do DANFSe (versão PDF). A versão em PDF está disponível no momento apenas para alguns municípios. Entre em contato conosco caso precise da versão em PDF para o seu município.
- data_emissao: Data da emissão da nota fiscal.
- caminho_xml_nota_fiscal: Caminho para acesso e download do XML da nota fiscal.
- codigo_verificacao: Código de verificação para consulta da NFSe, pode ser usado no portal da cidade para consulta.
- numero_nfse_substituida Caso a nota seja autorizada e seja uma nota de substituição, este campo irá indicar o número da NFSe substituída.
- numero_nfse_substituta Caso a nota seja autorizada e alguma outra nota substituta tenha sido emitido pela nossa API este campo irá indicar o seu número. No momento só é possível fazer esta associação se a nota substituta for emitida pela nossa API.
Download do XML e consulta do documento auxiliar da NFSe
Após a autorização da nota fiscal de serviço eletrônica será disponibilizado os campos:
- caminho_xml_nota_fiscal - Representa o caminho para montar a URL para download do XML. Por exemplo, se você utilizou o servidor api.focusnfe.com.br e o caminho_xml_nota_fiscal contém o caminho "/notas_fiscais_servico/NFSe075045050001324106902-004940940-428-DUMMY.xml" você poderá acessar o XML pela URL completa https://api.focusnfe.com.br/notas_fiscais_servico/NFSe075045050001324106902-004940940-428-DUMMY.xml
- url. A URL para consultar a NFSe direto no portal da prefeitura.
Utilize o método HTTP GET para ambas as consultas.
Não há obrigatoriedade legal de salvar o XML da nota, salvo quando o município utiliza NFe (modelo 55) ou NFCe (modelo 65) para emissão de notas de prestação de serviços. Nestes casos nossa API faz a guarda automática dos arquivos.
Cancelamento
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfse/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
justificativa={}
justificativa["justificativa"] = "Sua justificativa aqui!"
r = requests.delete(url+ref, data=json.dumps(justificativa), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
-X DELETE -d '{"justificativa":"Teste de cancelamento de nota"}' \
https://homologacao.focusnfe.com.br/v2/nfse/12345
import java.util.HashMap;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFSeCancelamento {
public static void main(String[] args){
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfse/"+ref);
/* Aqui criamos um hashmap para receber a chave "justificativa" e o valor desejado. */
HashMap<String, String> justificativa = new HashMap<String, String>();
justificativa.put("justificativa", "Informe aqui a sua justificativa para realizar o cancelamento da NFSe.");
/* Criamos um objeto JSON para receber a hash com os dados esperado pela API. */
JSONObject json = new JSONObject(justificativa);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.delete(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfse/" + ref
# altere os campos conforme a nota que será enviada
justificativa_cancelamento = {
justificativa: "Informe aqui a sua justificativa para realizar o cancelamento da NFSe."
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Delete a partir da uri de requisição
requisicao = Net::HTTP::Delete.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos a hash de justificativa do cancelamento para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = justificativa_cancelamento.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
// Você deve definir isso globalmente para sua aplicação
$ch = curl_init();
// Substituir pela sua identificação interna da nota
$ref = "12345";
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br";
$justificativa = array ("justificativa" => "Teste de cancelamento de nota");
$login = "token obtido no cadastro da empresa";
$password = "";
curl_setopt($ch, CURLOPT_URL, $server . "/v2/nfse/" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($justificativa));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$result = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//as três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema deverá
//interpretar e lidar com o retorno
print($result."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfse/"+ ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('DELETE', url, false, token);
var cancelar = {
"justificativa": "Sua justificativa aqui!"
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(cancelar));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Exemplos de respostas da API por status para a requisição de cancelamento:
cancelado (requisição realizada com sucesso)
{
"status": "cancelado"
}
erro_cancelamento (requisição com erro)
{
"status": "erro_cancelamento",
"erros": [
{
"codigo": "E523",
"mensagem": "nota que você está tentando cancelar está fora do prazo permitido para cancelamento",
"correcao": null
}
]
}
nfe_cancelada (quando a nota já consta como cancelada)
{
"codigo": "nfe_cancelada",
"mensagem": "Nota Fiscal já cancelada"
}
Para cancelar uma NFSe, basta fazer uma requisição à URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Cancelar uma NFSe já autorizada:
https://api.focusnfe.com.br/v2/nfse/REFERENCIA
Utilize o comando HTTP DELETE para cancelar a sua nota para nossa API. Este método é síncrono, ou seja, a comunicação com a prefeitura será feita imediatamente e devolvida a resposta na mesma requisição.
O parâmetro de cancelamento deverá ser enviado da seguinte forma:
- justificativa: Justificativa do cancelamento. Deverá conter de 15 a 255 caracteres.
A API irá em seguida devolver os seguintes campos:
- status: cancelado, se a nota pode ser cancelada, ou erro_cancelamento, se houve algum erro ao cancelar a nota.
- erros: um array de mensagens de erro que impedem que a nota seja cancelada .
Prazo de cancelamento A NFSe não possui um prazo padrão para cancelamento como vemos na NFCe, por exemplo. Outro detalhe importante é que como alguns municípios não possuem ambiente de homologação, é preciso emitir as notas de teste em produção. Sendo assim, recomendamos que sempre consulte o seu município antes de emitir uma NFSe.
Reenvio de email
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfse/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
emails = {}
email = "suporte@acras.com.br"
emails["emails"] = [email]
r = requests.delete(url+ref+"/email", data=json.dumps(emails), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
-X POST -d '{"emails":["alguem@example.org"]}' \
https://homologacao.focusnfe.com.br/v2/nfse/12345/email
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFSeEnviaEmail {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfse/"+ref+"/email");
/* Criamos o um objeto JSON que receberá um JSON Array com a lista de e-mails. */
JSONObject json = new JSONObject ();
JSONArray listaEmails = new JSONArray();
listaEmails.put("email_01@acras.com.br");
listaEmails.put("email_02@acras.com.br");
listaEmails.put("email_03@acras.com.br");
json.put("emails", listaEmails);
/* Testar se o JSON gerado está dentro do formato esperado.
System.out.print(json); */
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfse/" + ref + "/email"
# altere os campos conforme a nota que será enviada
emails_destinatarios = {
emails: ["email_01@acras.com.br", "email_02@acras.com.br", "email_03@acras.com.br"]
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos os dados da nota para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = emails_destinatarios.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
// Você deve definir isso globalmente para sua aplicação
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br";
// Substituir pela sua identificação interna da nota
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$email = array (
"emails" => array(
"email@email.com"
)
);
// Inicia o processo de envio das informações usando o cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfse/" . $ref . "/email");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($email));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//as três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema deverá
//interpretar e lidar com o retorno
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfse/" + ref + "/email";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var email = ["email1@acras.com.br", "email2@acras.com.br", "email3@acras.com.br"];
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
var json = JSON.stringify({"emails": email});
request.send(json);
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Para cada nota autorizada, cancelada ou que tenha sido emitida uma carta de correção o destinatário da nota é notificado via email. Porém eventualmente pode ser necessário enviar a nota fiscal para outras pessoas ou mesmo reenviar o email para o mesmo destinatário.
Para enviar um ou mais emails:
https://api.focusnfe.com.br/v2/nfse/REFERENCIA/email
Utilize o comando HTTP POST para enviar os emails. Esta operação aceita apenas um parâmetro:
- emails: Array com uma lista de emails que deverão receber uma cópia da nota. Limitado a 10 emails por vez.
A API imediatamente devolve a requisição com a confirmação dos emails. Os emails serão enviados em segundo plano, por isso pode levar alguns minutos até que eles cheguem à caixa postal.
Emissão NFSe por arquivo
Exemplo de um arquivo JSON:
{
"prestador":{
"cnpj":"18765499000199",
"inscricao_municipal":"12345",
"codigo_municipio":"3516200"
},
"lista_nfse": [
{
"data_emissao": "2019-03-19T12:07:26-03:00",
"natureza_operacao": 1,
"servico":{
"aliquota":3,
"discriminacao":"Nota fiscal referente a serviços prestados",
"iss_retido":"false",
"item_lista_servico":"0107",
"codigo_tributario_municipio": "620910000",
"valor_servicos":1.0
},
"tomador":{
"cnpj":"07504505000132",
"razao_social":"Acras Tecnologia da Informação LTDA",
"email":"contato@acras.com.br",
"endereco":{
"logradouro":"Rua Dias da Rocha Filho",
"numero":"999",
"complemento":"Prédio 04 - Sala 34C",
"bairro":"Alto da XV",
"codigo_municipio":"4106902",
"uf":"PR",
"cep":"80045165"
}
}
}
]
}
Algumas prefeituras possuem nota fiscal eletrônica de serviços mas não possuem a possibilidade de integrar com outros sistemas através de webservices. Nestes casos a prefeitura disponibiliza uma forma de importar vários RPS (Recibo Provisório de Serviço) que serão convertidos em notas de serviço, evitando o trabalho de digitar e autorizar cada NFSe de forma manual.
A API do Focus NFe atende essas situações fornecendo uma interface padronizada para geração destes arquivos, usando um formato muito similar com o já usado para autorizar NFSe’s individualmente.
A maior mudança é que o campo "prestador" fica em primeiro nível na nota, enquanto campos referentes a nota, como "servico", "tomador", "data_emissao" e demais, ficam aninhados dentro do campo "lista_nfse", que abriga as notas emitidas. Ao lado, mostramos um exemplo de como fica o JSON para gerar o lote.
Envio
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br/v2/lotes_rps"
'''
url = "https://homologacao.focusnfe.com.br/v2/lotes_rps"
# Substituir pela sua identificação interna da nota
ref = {"ref":"12345"}
token="token obtido no cadastro da empresa"
'''
Usamos dicionarios para armazenar os campos e valores que em seguida,
serao convertidos em JSON e enviados para nossa API
'''
lote_nfse = {}
lote_nfse["prestador"] = {}
lote_nfse["lista_nfse"] = []
lote_nfse["prestador"]["cnpj"] = "99999999999999"
lote_nfse["prestador"]["inscricao_municipal"] = "99999999"
lote_nfse["prestador"]["codigo_municipio"] = "9999999"
nfse = {}
nfse["data_emissao"] = "2018-02-26T12:00:00-03:00"
nfse["natureza_operacao"] = "1"
nfse["tomador"] = {}
nfse["tomador"]["cnpj"] = "99999999999999"
nfse["tomador"]["razao_social"] = "Parkinson da silva coelho JR"
nfse["tomador"]["endereco"] = {}
nfse["tomador"]["endereco"]["bairro"] = "São Miriti"
nfse["tomador"]["endereco"]["cep"] = "31999-000"
nfse["tomador"]["endereco"]["codigo_municipio"] = "9999999"
nfse["tomador"]["endereco"]["logradouro"] = "João Batista Netos"
nfse["tomador"]["endereco"]["numero"] = "34"
nfse["tomador"]["endereco"]["uf"] = "MG"
nfse["servico"] = {}
nfse["servico"]["aliquota"] = "2.92"
nfse["servico"]["base_calculo"] = "1.00"
nfse["servico"]["discriminacao"] = "SERVICOS E MAO DE OBRA"
nfse["servico"]["iss_retido"] = "0"
nfse["servico"]["item_lista_servico"] = "1412"
nfse["servico"]["valor_iss"] = "11.68"
nfse["servico"]["valor_liquido"] = "1.00"
nfse["servico"]["valor_servicos"] = "1.00"
lote_nfse["lista_nfse"].append(nfse)
#print (json.dumps(nfse))
resposta = requests.post(url, params=ref, data=json.dumps(lote_nfse), auth=(token,""))
# Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura
arquivo_lote_rps = open('arquivo_lote_rps.txt', 'w')
arquivo_lote_rps.write(resposta.text)
arquivo_lote_rps.close()
# arquivo.json deve conter os dados da NFSe
curl -u "token obtido no cadastro da empresa:" \
-X POST -T arquivo.json https://homologacao.focusnfe.com.br/v2/lotes_rps > arquivo_lote_rps.txt
import java.util.HashMap;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFSeAutorizar {
public static void main(String[] args) throws Exception{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/lotes_rps?ref="+ref);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
/* Aqui são criados as hash's que receberão os dados da nota. */
HashMap<String, String> nfse = new HashMap<String, String>();
HashMap<String, String> prestador = new HashMap<String, String>();
HashMap<String, String> tomador = new HashMap<String, String>();
HashMap<String, String> tomadorEndereco = new HashMap<String, String>();
HashMap<String, String> servico = new HashMap<String, String>();
dadosNfse.put("data_emissao", "2018-01-15T17:40:00");
dadosNfse.put("natureza_operacao", "1");
dadosPrestador.put("cnpj", "51916585000125");
dadosPrestador.put("inscricao_municipal", "123456");
dadosPrestador.put("codigo_municipio", "4128104");
dadosTomador.put("cpf", "51966818092");
dadosTomador.put("razao_social", "ACME LTDA");
dadosTomador.put("email", "email-do-tomador@google.com.br");
dadosTomadorEndereco.put("bairro", "Jardim America");
dadosTomadorEndereco.put("cep", "82620150");
dadosTomadorEndereco.put("codigo_municipio", "4106902");
dadosTomadorEndereco.put("logradouro", "Rua Paulo Centrone");
dadosTomadorEndereco.put("numero", "168");
dadosTomadorEndereco.put("uf", "PR");
dadosServico.put("discriminacao", "Teste de servico");
dadosServico.put("aliquota", "3.00");
dadosServico.put("base_calculo", "1.0");
dadosServico.put("valor_iss", "0");
dadosServico.put("iss_retido", "false");
dadosServico.put("codigo_tributario_municipio", "080101");
dadosServico.put("item_lista_servico", "0801");
dadosServico.put("valor_servicos", "1.0");
dadosServico.put("valor_liquido", "1.0");
/* Depois de fazer o input dos dados, são criados os objetos JSON já com os valores das hash's. */
JSONObject loteNfse = new JSONObject ();
JSONArray listaNfse = new JSONArray();
JSONObject nfse = new JSONObject (dadosNfse);
JSONObject prestador = new JSONObject (dadosPrestador);
JSONObject tomador = new JSONObject (dadosTomador);
JSONObject tomadorEndereco = new JSONObject (dadosTomadorEndereco);
JSONObject servico = new JSONObject (dadosServico);
/* Aqui adicionamos os objetos JSON nos campos da API como array no JSON principal. */
listaNfse.put(nfse)
loteNfse.put("prestador", prestador);
loteNfse.put("listaNfse", listaNfse)
tomador.put("endereco", tomadorEndereco);
nfse.put("tomador", tomador);
nfse.put("servico", servico);
/* É recomendado verificar como os dados foram gerados em JSON e se ele está seguindo a estrutura especificada em nossa documentação.
System.out.print(json); */
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura. */
BufferedWriter writer = new BufferedWriter(new FileWriter("arquivo_lote_rps.txt"));
writer.write(body);
writer.close();
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/lotes_rps?ref=" + ref
# altere os campos conforme a nota que será enviada
lote_nfse = {
prestador: {
cnpj: "18765499000199",
inscricao_municipal: "12345",
codigo_municipio: "3516200"
},
"lista_nfse": [
{
data_emissao: "2017-09-21T22:15:00",
natureza_operacao: 1,
tomador: {
cnpj: "07504505000132",
razao_social: "Acras Tecnologia da Informação LTDA",
email: "contatoacras.com.br",
endereco: {
logradouro: "Rua Dias da Rocha Filho",
numero: "999",
complemento: "Prédio 04 - Sala 34C",
bairro: "Alto da XV",
codigo_municipio: "4106902",
uf: "PR",
cep: "80045165"
}
},
servico: {
aliquota: 3,
discriminacao: "Nota fiscal referente a serviços prestados",
iss_retido: "false",
item_lista_servico: "0107",
codigo_tributario_municipio: "620910000",
valor_servicos: 1.0
}
}
]
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos os dados da nota para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = lote_nfse.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura.
File.open('arquivo_lote_rps.txt', 'w') { |arquivo| arquivo.puts resposta.body }
<?php
// Você deve definir isso globalmente para sua aplicação
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br";
// Substituir pela sua identificação interna da nota
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$lote_nfse = array (
"prestador" => array(
"cnpj" => "51916585000125",
"inscricao_municipal" => "12345",
"codigo_municipio" => "4119905"
),
"lista_nfse" => array(
array(
"data_emissao" => "2017-12-27T17:43:14-3:00",
"natureza_operacao" => "1",
"tomador" => array(
"cnpj" => "07504505000132",
"razao_social" => "Acras Tecnologia da Informação LTDA",
"email" => "contato@acras.com.br",
"endereco" => array(
"bairro" => "Jardim America",
"cep" => "81530900",
"codigo_municipio" => "4119905",
"logradouro" => "Rua ABC",
"numero" => "16",
"uf" => "PR"
)
),
"servico" => array(
"discriminacao" => "Exemplo Serviço",
"iss_retido" => "false",
"item_lista_servico" => "106",
"codigo_cnae" => "6319400",
"valor_servicos" => "1.00"
)
)
)
);
// Inicia o processo de envio das informações usando o cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/lotes_rps?ref=" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($lote_nfse));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura.
$arquivo_lote_rps = fopen("arquivo_lote_rps.txt", "w") or die("Não foi possível abrir o arquivo!");
fwrite($arquivo_lote_rps, $body);
fclose($arquivo_lote_rps);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
let XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
let fs = require('fs')
let request = new XMLHttpRequest();
const token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota
let ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
let url = "https://homologacao.focusnfe.com.br/v2/lotes_rps?ref=" + ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
let lote_nfse = {
"prestador":{
"cnpj":"51916585000125",
"inscricao_municipal":"12345",
"codigo_municipio":"3518800"
},
"lista_nfse": [
{
"data_emissao":"2018-03-21",
"natureza_operacao":"1",
"tomador":{
"cnpj":"07504505000132",
"razao_social":"Acras Tecnologia da Informacao LTDA",
"email":"contato@acras.com.br",
"endereco":{
"logradouro":"Rua Filho da Rocha Bage",
"numero":"750",
"complemento":"Sala 07",
"bairro":"Alto da Rua XV",
"codigo_municipio":"4106902",
"uf":"PR",
"cep":"80045165"
}
},
"servico":{
"aliquota":3,
"discriminacao":"Nota fiscal referente a servicos prestados",
"iss_retido":"false",
"item_lista_servico":"1401",
"codigo_tributario_municipio": "452000100",
"valor_servicos":1.0
}
}
]
};
// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(lote_nfse));
// Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura.
fs.writeFile('arquivo_lote_rps.txt', request.responseText);
Para gerar o arquivo do lote RPS, o envio dos dados é feito utilizando a URL abaixo (caso o envio seja em homologação, alterar para a URL correspondente):
https://api.focusnfe.com.br/v2/lotes_rps?ref=REFERENCIA
Os dados que devem ir no POST é um arquivo JSON muito similar ao arquivo de autorização de NFSe. Caso não haja nenhuma falha, a API retornará os dados para geração do arquivo. As informações que devem ser enviadas consistem nos seguintes campos:
- prestador:
- cnpj: CNPJ do prestador de serviços.
- codigo_municipio: Código IBGE do município do prestador
- inscricao_municipal: Inscrição municipal do prestador de serviços.
- lista_nfse:
- Array com as notas a serem geradas, usando o mesmo formato do arquivo de NFSe omitindo apenas a seção “prestador”.
A solicitação é síncrona e pode retornar os seguintes status HTTP:
HTTP CODE/STATUS | Descrição |
---|---|
HTTP status 201 (Created) | Arquivo de importação gerado. É devolvido o conteúdo do arquivo como resposta |
HTTP status 415 (Unsupported Media Type) | Formato de arquivo YAML inválido |
HTTP status 422 (Unprocessable Entity) | Campos obrigatórios não preenchidos ou em formato incorreto |
HTTP status 400 (Bad Request ) | Requisição rejeitada devido a CNPJ ou token inválido (mensagem de erro apropriada é exibida) |
Consulta
# Faça o download e instalação da biblioteca requests, através do python-pip.
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/lotes_rps/"
# Substituir pela sua identificação interna da nota
ref = "12345"
token="token obtido no cadastro da empresa"
r = requests.get(url+ref, auth=(token,""))
# Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura
arquivo_lote_rps = open('arquivo_lote_rps.txt', 'w')
arquivo_lote_rps.write(resposta.text)
arquivo_lote_rps.close()
curl -u "token obtido no cadastro da empresa:" \
-X GET https://homologacao.focusnfe.com.br/v2/lotes_rps/12345 > arquivo_lote_rps.txt
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NFSeConsulta {
public static void main(String[] args) throws Exception{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/lotes_rps/"+ref);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = (ClientResponse) request.get(ClientResponse.class);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura. */
BufferedWriter writer = new BufferedWriter(new FileWriter("arquivo_lote_rps.txt"));
writer.write(body);
writer.close();
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/lotes_rps/" + ref
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Get a partir da uri de requisição
requisicao = Net::HTTP::Get.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura.
File.open('arquivo_lote_rps.txt', 'w') { |arquivo| arquivo.puts resposta.body }
<?php
// Você deve definir isso globalmente para sua aplicação
//Substituir pela sua identificação interna da nota
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br"; // Servidor de homologação
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/lotes_rps/" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
// Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura.
$arquivo_lote_rps = fopen("arquivo_lote_rps.txt", "w") or die("Não foi possível abrir o arquivo!");
fwrite($arquivo_lote_rps, $body);
fclose($arquivo_lote_rps);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
let XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
let fs = require('fs')
let request = new XMLHttpRequest();
let token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota
let ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
let url = "https://homologacao.focusnfe.com.br/v2/lotes_rps/" + ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('GET', url, false, token);
request.send();
// Salvar os dados da resposta em arquivo destino a importação no sistima da prefeitura.
fs.writeFile('arquivo_lote_rps.txt', request.responseText);
Para os lotes que já foram gerados, é possível fazer a consulta do mesmo. O retorno para a requisição será igual ao do envio, ou seja, serão retornardo os dados para gerar o arquivo para realizar a importação no site da prefeitura.
Esta operação está disponível na URL abaixo:
https://api.focusnfe.com.br/v2/lotes_rps/REFERENCIA
- retorno:
- HTTP status 200 (OK) – É devolvido o conteúdo do arquivo de importação como resposta
- HTTP status 404 (Not found) – Lote não encontrado com referência informada
Resposta (opcional)
# Faça o download e instalação da biblioteca requests, através do python-pip.
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
ref = "12345"
url = "https://homologacao.focusnfe.com.br/v2/lotes_rps/" + ref + "/resposta"
# Substituir pela sua identificação interna da nota
token="token obtido no cadastro da empresa"
# Aqui é feita a leitura do conteúdo do arquivo de retorno baixado no site da prefeitura
arquivo = open("caminho/arquivo_retorno.txt", "r")
r = requests.post(url, data=arquivo.read(), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
-X POST https://homologacao.focusnfe.com.br/v2/lotes_rps/12345/resposta -T caminho/arquivo_retorno.txt
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class LoteNFSeConsulta {
public static void main(String[] args) throws IOException {
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interna da nota. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/lotes_rps/"+ref);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
// Aqui é feita a leitura do conteúdo do arquivo de retorno baixado no site da prefeitura
String retorno = new String(Files.readAllBytes(Paths.get("caminho/arquivo_retorno.txt")));
WebResource request = client.resource(url, retorno);
ClientResponse resposta = (ClientResponse) request.post(ClientResponse.class);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/lotes_rps/" + ref
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Get a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
// Aqui é feita a leitura do conteúdo do arquivo de retorno baixado no site da prefeitura
retorno = File.read('caminho/arquivo_retorno.txt', 'r')
requisicao.body = retorno.to_s
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
// Você deve definir isso globalmente para sua aplicação
//Substituir pela sua identificação interna da nota
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
// Aqui é feita a leitura do conteúdo do arquivo de retorno baixado no site da prefeitura
$retorno = file_get_contents("caminho/arquivo_retorno.txt");
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br"; // Servidor de homologação
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/lotes_rps/" . $ref . "/resposta");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $retorno);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//as três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema deverá
//interpretar e lidar com o retorno
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
let XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
let fs = require('fs');
let request = new XMLHttpRequest();
let token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interna da nota
let ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
let url = "https://homologacao.focusnfe.com.br/v2/lotes_rps/" + ref + "/resposta";
// Aqui é feita a leitura do conteúdo do arquivo de retorno baixado no site da prefeitura
let retorno = fs.readFile('caminho/arquivo_retorno.txt');
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
request.send(retorno);
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Algumas prefeituras disponibilizam um arquivo de resposta, que poderá informar erros no arquivo enviado ou informar dados da nota fiscal gerada (por exemplo número e código de verificação). Quando implementado, é possível enviar a resposta da prefeitura para nossa API, utilizando a URL abaixo, e iremos gerar a resposta de acordo com o padrão da nossa API:
https://api.focusnfe.com.br/v2/lotes_rps/REFERENCIA/resposta
- retorno:
- HTTP status 201 (Created) – Arquivo de importação gerado. É devolvido o status de cada nota enviada. Nenhuma nota é processada se alguma nota tiver algum erro.
- HTTP status 415 (Unsupported Media Type) – Formato de arquivo inválido
- HTTP status 400 (Bad Request ) – Requisição rejeitada devido a CNPJ ou token inválido (mensagem de erro apropriada é exibida)
Exemplo de resposta para o envio do arquivo de retorno do Lote NFSe:
{
"status":"autorizado",
"numero":"9999",
"codigo_verificacao":"311299647",
"data_emissao":"2017-09-09T10:20:00-03:00",
"uri":"https://www.barueri.sp.gov.br/nfe/",
"caminho_xml_nota_fiscal":"/notas_fiscais_servico/NFSe191517072001883518800-1898781-9999-312276647.xml"
}
NFSes recebidas (beta)
Da mesma forma que a manifestação de NFe, a API para busca de NFSes recebidas do sistema Focus permite que você consulte as notas de serviço onde sua empresa é a tomadora do serviço nos municípios onde isso é possível. No caso da NFSe, não existe a operação de manifestação. No momento a busca de notas está sendo possível apenas no município de São Paulo.
Através desta documentação deverá ser possível fazer a integração com a API do Focus NFe, caso alguma dúvida permaneça você pode entrar em contato com o suporte através do e-mail suporte@acras.com.br. Através deste canal você pode também solicitar a implementação de algum município que possibilite a busca de notas recebidas de forma automática.
URLs
Método | URL (recurso) | Ação |
---|---|---|
GET | /v2/nfses_recebidas?cnpj=CNPJ | Busca os dados de todas as NFSes recebidas. |
Status API
Aqui você encontra os status possíveis para MDe.
HTTP CODE/STATUS | Status API Focus | Descrição | Correção |
---|---|---|---|
400 - bad request | requisicao_invalida | CNPJ do emitente não autorizado ou não informado. | Verifique no Painel API se esse emitente está habilitado para realizar a busca de NFSes recebidas. Verifique se o CNPJ foi informado no JSON de envio. |
400 - bad request | requisicao_invalida | CNPJ/UF do emitente não autorizado ou não informado. | Verifique no Painel API se esse emitente está habilitado para realizar a busca de NFSes recebidas. Verifique se o CNPJ foi informado no JSON de envio. |
403 - forbidden | permissao_negada | CNPJ do emitente não autorizado. | O emitente utilizado não está autorizado a realizar a operação de busca ou foi informado o CNPJ do emitente incorretamente no JSON. |
Consulta de NFSe Recebidas
Uma NFSe pode ser cancelada após ter sido recebida. Por este motivo as NFSes recebidas possuem um campo chamado “versao” que é único entre todos os documentos do mesmo CNPJ e que é atualizado a cada alteração nesta NFSe. Isto facilita a busca apenas dos documentos que seu sistema ainda não conhece, sendo necessário que você armazene apenas um número por CNPJ.
Por exemplo, se você recebe uma NFSe com versao = 60, e ela posteriormente for cancelada, sua versão será atualizada para algum número maior que 60.
A API busca as últimas atualizações das prefeituras uma vez ao dia.
Método de consulta
Exemplo de como consultar todas as notas recebidas de uma empresa.
# Faça o download e instalação da biblioteca requests, através do python-pip.
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/nfses_recebidas?cnpj="
token="token obtido no cadastro da empresa"
cnpj = "cnpj_do_destinatario_da_nota"
r = requests.get(url+cnpj, auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
"https://homologacao.focusnfe.com.br/v2/nfses_recebidas?cnpj=SEU_CNPJ"
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class ConsultarTodosManifestos {
public static void main(String[] args) {
String login = "Token_obtido_no_cadastro_da_empresa";
String cnpj = "CNPJ_da_sua_empresa";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/nfses_recebidas?cnpj="+cnpj);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.get(ClientResponse.class);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
cnpj = "CNPJ_da_sua_empresa"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/nfses_recebidas?cnpj=" + cnpj
# criamos uma objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Get a partir da uri de requisição
requisicao = Net::HTTP::Get.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
<?php
// Solicite o seu token para realizar as requisições com nossa equipe de suporte.
$login = "Token_obtido_no_cadastro_da_empresa";
$cnpj = "CNPJ_da_sua_empresa";
// Para ambiente de Produção, utilize a URL: https://api.focusnfe.com.br/.
$server = "https://homologacao.focusnfe.com.br/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."v2/nfses_recebidas?cnpj=".$cnpj);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
/* Métodos para realizar a autenticação básica do HTTP.
Não é necessário informar campo senha, apenas o campo login. */
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// Mostra na tela o HTTP Code da sua requisição.
print($http_code);
// Mostra na tela a mensagem de retorno da API.
print($body);
curl_close($ch);
?>
/*
A orientacao a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
var cnpj = "cnpj_do_destinatario_da_nota";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfses_recebidas?cnpj=" + cnpj;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('GET', url, false, token);
request.send();
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
Para consultar os documentos fiscais recebidos, utilize o endereço abaixo:
https://api.focusnfe.com.br/v2/nfses_recebidas?cnpj=CNPJ
Utilize o método HTTP GET para consultar as notas. Esta requisição aceita os seguintes parâmetros que deverão ser enviados na URL:
- cnpj(*): CNPJ da empresa. Campo obrigatório.
- versao: Se informado, irá buscar apenas os documentos cuja versão seja maior que o parâmetro recebido. Utilize este parâmetro para buscar apenas as notas que seu sistema ainda não conhece.
- completa: Se informado com o valor "1" irá devolver os dados completos do XML da nota, seguindo o padrão dos dados enviados para emissão de NFSe. Caso contrário, irá devolver os dados de forma resumida conforme descrito na próxima seção.
Serão devolvidas as 100 primeiras notas encontradas. Para recuperar as demais notas você deverá fazer uma nova requisição alterando o campo versão.
Exemplo dos dados de resposta:
[
{
"numero": 3240,
"numero_rps": 3187,
"serie_rps": "UNICA",
"data_emissao": "2019-11-01T09:53:01-03:00",
"data_emissao_rps": "2019-11-01T00:00:00-03:00",
"valor_total": 63.5,
"situacao": "autorizada",
"documento_prestador": "11131112000133",
"nome_prestador": null,
"inscricao_municipal_prestador": "12224222",
"versao": 123,
"codigo_verificacao": "IAAAXAAB",
"url": "https://nfe.prefeitura.sp.gov.br/contribuinte/notaprint.aspx?inscricao=12224222&nf=3240&verificacao=IAAAXAAA",
"url_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos/11110100000111/201911/NFSeRecebidas/NFSe111101000001113220308-12224222-3240-IAAAXAAA.xml",
"nome_municipio": "São Paulo",
"sigla_uf": "SP",
"codigo_municipio": "3550308"
}
]
Dados devolvidos
A API irá devolver os seguintes cabeçalhos HTTP:
- X-Total-Count: O número total de registros (incluindo aqueles que não foram devolvidos pelo limite de 100 registros)
- X-Max-Version: Valor máximo da versão dos documentos devolvidos. Utilize este cabeçalho para utilizar na próxima busca de versão, caso seja necessário.
Os dados devolvidos podem vir em dois formatos: modo simplificado (default) e completo. Se utilizado o formato simplificado o corpo da resposta será um array de objetos em JSON no seguinte formato:
- numero: Número da NFSe.
- numero_rps: Número do RPS, se existir.
- serie_rps: Série do RPS, se existir.
- data_emissao: Data de emissão da NFSe.
- data_emissao_rps: Data de emissão do RPS, se existir.
- valor_total: Valor total da NFSe.
- situacao: Situação da NFSe. Pode ser: autorizada ou cancelada.
- documento_prestador: CNPJ ou CPF do emitente do documento fiscal.
- inscricao_municipal_prestador: CNPJ ou CPF do emitente do documento fiscal.
- versao: Versão do documento fiscal. Este número irá mudar apenas se o documento for alterado de alguma forma.
- codigo_verificacao: Código de verificação da NFSe.
- url: URL para visualização da NFSe no site da prefeitura.
- url_xml: URL para download do XML da NFSe.
- nome_municipio: Nome do município do prestador.
- sigla_uf: UF do prestador.
- codigo_municipio: Código IBGE do município do prestador.
Você pode também configurar o gatilho "nfse_recebida" para receber estes dados resumidos diretamente em sua aplicação assim que estiverem disponíveis na API. Consulte a seção de Gatilhos / Webhooks
Exemplo dos dados de resposta usando o parâmetro completa=1:
[
{
"numero": "3240",
"codigo_verificacao": "HT9MPFM1",
"numero_rps": "3187",
"serie_rps": "1",
"tipo_rps": "RPS",
"status": "N",
"situacao": "autorizada",
"versao": 123,
"prestador": {
"cnpj": "11131112000133",
"inscricao_municipal": "12224222"
},
"tomador": {
"razao_social": "Tomador Ltda",
"cnpj": "11131112000134",
"inscricao_municipal": null,
"endereco": {
"nome_municipio": "Florianópolis",
"bairro": "Bom Retiro",
"cep": "89223001",
"codigo_municipio": null,
"logradouro": "AV Santos Dumont",
"numero": "22",
"uf": "SC"
}
},
"data_emissao": "2019-11-01T09:53:01-03:00",
"optante_simples_nacional": "",
"incentivador_cultural": "",
"valor_liquido": "450",
"servico": {
"valor_servicos": "450",
"valor_deducoes": null,
"valor_pis": "2.93",
"valor_cofins": "13.5",
"valor_inss": null,
"valor_ir": null,
"valor_csll": "4.5",
"valor_iss": 22.5,
"item_lista_servico": "3123",
"aliquota": "0.0500",
"iss_retido": "false",
"discriminacao": "Prestação de serviço",
"codigo_municipio": null
}
}
]
Caso utilize o argumento "completa=1" os dados serão devolvidos no mesmo formato de emissão de NFSe. Acrescentado dos campos "versao" e "situacao" descritos acima.
CTe e CTe OS
Através da API CTe é possível:
- Emitir CTe (Conhecimento de Transporte Eletrônico) utilizando dados simplificados. Este processo é assíncrono. Ou seja, após a emissão a nota será enfileirada para processamento.
- Emitir CTe OS (outros serviços) utilizando dados simplificados. Este processo é síncrono. Ou seja, na mesma requisição é feito processamento da CTe.
- Cancelar uma CTe de qualquer modelo.
- Consultar o status de CTe emitidas.
- Emitir os eventos: carta de correção, prestação em desacordo, registro multimodal e informações GTV (apenas CTe OS)
- Inutilizar uma faixa de numeração de CTe de qualquer modelo
URLs
Método | URL (recurso) | Ação |
---|---|---|
POST | /v2/cte?ref=REFERENCIA | Cria uma CTe a envia para processamento. |
POST | /v2/cte_os?ref=REFERENCIA | Emite uma CTe OS. |
GET | /v2/cfe/REFERENCIA | Consulta a CTe com a referência informada e o seu status de processamento |
DELETE | /v2/cfe/REFERENCIA | Cancela uma CTe com a referência informada |
POST | /v2/cte/REFERENCIA/carta_correcao | Cria uma carta de correção para a CTe com a referência informada. |
POST | /v2/cte/inutilizacao | Inutiliza uma numeração da CTe |
Campos de um CTe
Abaixo um exemplo de dados de uma CTe:
{
"modal_aereo": {
"numero_minuta": "000001234",
"numero_operacional": "12345678901",
"data_prevista_entrega": "2018-01-01",
"dimensao_carga": "1234X1234X1234",
"informacoes_manuseio": "03",
"classe_tarifa": "G",
"codigo_tarifa": "123",
"valor_tarifa": "123.00"
},
"cfop": "5353",
"natureza_operacao": "PREST. DE SERV. TRANSPORTE A ESTAB. COMERCIAL",
"data_emissao": "2018-05-17T11:13:04-03:00",
"tipo_documento": 0,
"codigo_municipio_envio": "2927408",
"municipio_envio": "Salvador",
"uf_envio": "BA",
"codigo_municipio_inicio": 2927408,
"tipo_servico": 0,
"municipio_inicio": "Salvador",
"uf_inicio": "BA",
"codigo_municipio_fim": "2927408",
"municipio_fim": "Salvador",
"uf_fim": "BA",
"retirar_mercadoria": "0",
"detalhes_retirar": "Teste detalhes retirar",
"indicador_inscricao_estadual_tomador": "9",
"tomador": "3",
"caracterisca_adicional_transporte": "c.adic.transp.",
"caracterisca_adicional_servico": "Teste caract add servico",
"funcionario_emissor": "func.emiss",
"codigo_interno_origem": "Teste codigo interno origem",
"codigo_interno_passagem": "codIntPass",
"codigo_interno_destino": "Teste codigo interno destino",
"codigo_rota": "cod rota",
"tipo_programacao_entrega": "0",
"sem_hora_tipo_hora_programada": "0",
"cnpj_emitente": "11111451000111",
"cpf_remetente": "08111727908",
"nome_remetente": "CT-E EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"telefone_remetente": "7734629600",
"logradouro_remetente": "R. XYZ",
"numero_remetente": "1205",
"bairro_remetente": "Vila Perneta",
"codigo_municipio_remetente": "4119152",
"municipio_remetente": "Pinhais",
"uf_remetente": "PR",
"cep_remetente": "83124310",
"codigo_pais_remetente": "1058",
"pais_remetente": "Brasil",
"cnpj_destinatario": "00112222000149",
"inscricao_estadual_destinatario": "02220020926081",
"nome_destinatario": "CT-E EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"telefone_destinatario": "7333332600",
"logradouro_destinatario": "R. Alto Parana",
"numero_destinatario": "190",
"bairro_destinatario": "Sao Cristovao",
"codigo_municipio_destinatario": "2927408",
"municipio_destinatario": "Salvador",
"uf_destinatario": "BA",
"cep_destinatario": "83222380",
"codigo_pais_destinatario": "1058",
"pais_destinatario": "Brasil",
"email_destinatario": "fiscal@example.com",
"valor_total": "1500.00",
"valor_receber": "750.00",
"icms_situacao_tributaria": "00",
"icms_base_calculo": "50635.27",
"icms_aliquota": "17.00",
"icms_valor": "8608.00",
"valor_total_carga": "200000.00",
"produto_predominante": "teste produto carga",
"outras_caracteristicas_carga": "teste caracteristicas carga",
"quantidades": [
{
"codigo_unidade_medida": "01",
"tipo_medida": "PESO BRUTO",
"quantidade": "1.0000"
},
{
"codigo_unidade_medida": "02",
"tipo_medida": "PESO BRUTO",
"quantidade": "2.0000"
}
],
"valor_carga_averbacao": "200000.00",
"nfes": [
{
"chave_nfe": "35122225222278000855550010000002821510931504",
"pin_suframa": "1234",
"data_prevista": "2018-05-07"
}
],
"valor_original_fatura": "12000.00",
"valor_desconto_fatura": "1000.00",
"valor_liquido_fatura": "11000.00",
"duplicatas": [
{
"data_vencimento": "2018-05-07",
"valor": "13000.00"
}
]
}
A CTe possui vários campos para os mais variados tipos e formas de operações, por isso, criamos uma página exclusiva que mostra todos os campos da nossa API para o envio de CTe. Nela, você pode buscar os campos pela TAG XML ou pela nossa tradução para API.
Documentação completa dos campos CTe
Documentação completa dos campos CTe OS
Além dos campos descritos acima, cada CTe deverá obrigatoriamente informar um modal, que é a forma de transporte da carga. Você deverá informar uma das seguintes chaves nos dados, clique em cada link para visualizar os campos completos:
- modal_rodoviario para transporte rodoviário. Consulte campos para CTe e Consulte campos para CTe OS
- modal_aereo para transporte aéreo.
- modal_aquaviario para transporte aquaviário.
- modal_ferroviario para transporte ferroviário.
- modal_dutoviario para transporte dutoviário.
- modal_multimodal para transporte que utilize mais de um modal.
Para CTe-OS é necessário informar dados adicionais do modal apenas quando este for rodoviário. Nos outros casos não é necessário.
Status API
Aqui você encontra os status possíveis para CTe e CTe OS.
HTTP CODE/STATUS | Status API Focus | Descrição | Correção |
---|---|---|---|
422 - unprocessable entity | erro_validacao_schema | Erro na validação do Schema XML | Verifique o detalhamento do erro na resposta da API. |
400 - bad request | forma_emissao_invalida | A forma de emissão utilizada é inválida | As formas de emissão disponíveis estão contidas na documentação da API. |
400 - bad request | campos_invalidos | O parâmetro 'numero' não foi informado | É necessário informar o número do CTe, use o campo "numero" em seu JSON. |
400 - bad request | campos_invalidos | O parâmetro 'serie' não foi informado | É necessário informar a série do CTe, use o campo "serie" em seu JSON. |
400 - bad request | campos_invalidos | OCampo 'X não é válido | Onde X é o nome do campo inválido. Verifique a documentação dos campos da API para CTe ou CTe OS. |
400 - bad request | modelo_invalido | Para esta URL só é permitida a emissão de CT-e modelo 57 | Será exibida essa mensagem quando for usado a URL de CTe para emissão de CTe OS ou vice-versa. Consulte as documentações sobre esses documentos. |
400 - bad request | campos_invalidos_modal | Esse status indica erros nos campos do modal usado. Verifique os campos informados e compare com a nossa documentação de campos. | |
400 - bad request | empresa_nao_habilitada | Empresa ainda não habilitada para emissão de CT-e | Verifique o cadastro do emitente no Painel API, deve-se habilitar CTe e/ou CTe OS para começar a emitir este documento. |
409 - conflict | cte_ja_autorizado | Já existe um CT-e autorizado utilizando esta referência | Altere a referência da requisição e tente novamente. |
409 - conflict | cte_em_processamento | Já existe um CT-e utilizando essa referencia e ele está em processamento | Altere a referência da requisição e tente novamente. |
404 - not found | nao_encontrado | CT-e não encontrado | CT-e informado na requisição não foi encontrado. |
400 - bad request | nao_autorizado | CT-e não autorizado | CT-e informado na requisição não foi autorizado, informe o evento GTV apenas para CTe O.S(modelo 67). |
400 - bad request | requisicao_invalida | Sua requisição é inválida porque alguns dos paramêtros básicos não foram cumpridos. Entre em contato com o nosso suporte. |
Envio
# arquivo.json deve conter os dados da CTe
curl -u "token obtido no cadastro da empresa:" \
-X POST -T cte.json https://homologacao.focusnfe.com.br/v2/cte?ref=12345
curl -u "token obtido no cadastro da empresa:" \
-X POST -T cte_os.json https://homologacao.focusnfe.com.br/v2/cte_os?ref=12345
import java.util.HashMap;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class Autorizar {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interno do CTe. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/cte_os?ref="+ref);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
/* Aqui são criados as hash's que receberão os dados do CTe. */
HashMap<String, String> cte = new HashMap<String, String>();
HashMap<String, String> seguroCarga = new HashMap<String, String>();
HashMap<String, String> documentosReferenciados = new HashMap<String, String>();
cte.put("bairro_emitente","Sao Cristova");
cte.put("bairro_tomador","Bacacheri");
cte.put("cep_emitente","99880077");
cte.put("cep_tomador","88991188");
cte.put("cfop","5353");
cte.put("cnpj_emitente","51916585000125");
cte.put("cnpj_tomador","51966818092777");
cte.put("codigo_municipio_emitente","2927408");
cte.put("codigo_municipio_envio","5200050");
cte.put("codigo_municipio_fim","3100104");
cte.put("codigo_municipio_inicio","5200050");
cte.put("codigo_municipio_tomador","4106902");
cte.put("codigo_pais_tomador","1058");
cte.put("complemento_emitente","Andar 19 - sala 23");
cte.put("data_emissao","2018-06-18T09:17:00");
cte.put("descricao_servico","Descricao do seu servico aqui");
cte.put("funcionario_emissor","Nome do funcionario que fez a emissao");
cte.put("icms_aliquota","17.00");
cte.put("icms_base_calculo","1.00");
cte.put("icms_situacao_tributaria","00");
cte.put("icms_valor","0.17");
cte.put("indicador_inscricao_estadual_tomador","9");
cte.put("inscricao_estadual_emitente","12345678");
cte.put("logradouro_emitente","Aeroporto Internacional de Salvador");
cte.put("logradouro_tomador","Rua Joao Dalegrave");
cte.put("modal","02");
cte.put("municipio_emitente","Salvador");
cte.put("municipio_envio","Abadia de Goias");
cte.put("municipio_fim","Abadia dos Dourados");
cte.put("municipio_inicio","Abadia de Goias");
cte.put("municipio_tomador","Curitiba");
cte.put("natureza_operacao","PREST. DE SERV. TRANSPORTE A ESTAB. COMERCIAL");
cte.put("nome_emitente","ACME LTDA");
cte.put("nome_fantasia_emitente","ACME");
cte.put("nome_fantasia_tomador","Nome do tomador do servico aqui");
cte.put("nome_tomador","NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL");
cte.put("numero_emitente","S/N");
cte.put("numero_fatura","1");
cte.put("numero_tomador","1");
cte.put("pais_tomador","BRASIL");
cte.put("quantidade","1.0000");
cte.put("telefone_emitente","4133336666");
cte.put("tipo_documento","0");
cte.put("tipo_servico","6");
cte.put("uf_emitente","BA");
cte.put("uf_envio","GO");
cte.put("uf_fim","MG");
cte.put("uf_inicio","GO");
cte.put("uf_tomador","PR");
cte.put("valor_desconto_fatura","0.00");
cte.put("valor_inss","0.10");
cte.put("valor_liquido_fatura","1.00");
cte.put("valor_original_fatura","1.00");
cte.put("valor_receber","1.00");
cte.put("valor_total","1.00");
cte.put("valor_total_tributos","0.00");
segurosCarga.put("nome_seguradora","Nome da seguradora aqui");
segurosCarga.put("numero_apolice","12345");
segurosCarga.put("responsavel_seguro","4");
documentosReferenciados.put("data_emissao","2018-06-18");
documentosReferenciados.put("numero","1");
documentosReferenciados.put("serie","1");
documentosReferenciados.put("subserie","1");
documentosReferenciados.put("valor","1.00");
/* Depois de fazer o input dos dados, são criados os objetos JSON já com os valores das hash's. */
JSONObject json = new JSONObject (cte);
JSONObject jsonSegurosCarga = new JSONObject (segurosCarga);
JSONObject jsonDocumentosReferenciados = new JSONObject (documentosReferenciados);
/* Aqui adicionamos os objetos JSON nos campos da API como array no JSON principal. */
json.append("segurosCarga", jsonSegurosCarga);
json.append("documentosReferenciados", jsonDocumentosReferenciados);
/* É recomendado verificar como os dados foram gerados em JSON e se ele está seguindo a estrutura especificada em nossa documentação.*/
//System.out.print(json);
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas a seguir exibem as informações retornadas pela nossa API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/cte?ref=" + ref
# altere os campos conforme a nota que será enviada
cte = {
bairro_emitente: "Sao Cristovao",
bairro_tomador: "Bacacheri",
cep_emitente: "99880077",
cep_tomador: "88991188",
cfop: "5353",
cnpj_emitente: "51916585000125",
cnpj_tomador: "51966818092777",
codigo_municipio_emitente: "2927408",
codigo_municipio_envio: "5200050",
codigo_municipio_fim: "3100104",
codigo_municipio_inicio: "5200050",
codigo_municipio_tomador: "4106902",
codigo_pais_tomador: "1058",
complemento_emitente: "Andar 19 - sala 23",
data_emissao: "2018-06-18T09:17:00",
descricao_servico: "Descricao do seu servico aqui",
documentos_referenciados: [
{
data_emissao: "2018-06-10",
numero: "1",
serie: "1",
subserie: "1",
valor: "1.00"
}
]
funcionario_emissor: "Nome do funcionario que fez a emissao",
icms_aliquota: "17.00",
icms_base_calculo: "1.00",
icms_situacao_tributaria: "00",
icms_valor: "0.17",
indicador_inscricao_estadual_tomador: "9",
inscricao_estadual_emitente: "12345678",
logradouro_emitente: "Aeroporto Internacional de Salvador",
logradouro_tomador: "Rua Joao Dalegrave",
modal: "02",
municipio_emitente: "Salvador",
municipio_envio: "Abadia de Goias",
municipio_fim: "Abadia dos Dourados",
municipio_inicio: "Abadia de Goias",
municipio_tomador: "Curitiba",
natureza_operacao: "PREST. DE SERV. TRANSPORTE A ESTAB. COMERCIAL",
nome_emitente: "ACME LTDA",
nome_fantasia_emitente: "ACME",
nome_fantasia_tomador: "Nome do tomador do servico aqui",
nome_tomador: "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
numero_emitente: "S/N",
numero_fatura: "1",
numero_tomador: "1",
pais_tomador: "BRASIL",
quantidade: "1.00",
seguros_carga: [
{
nome_seguradora: "Nome da seguradora aqui",
numero_apolice: "12345",
responsavel_seguro: 4
}
],
telefone_emitente: "4133336666",
tipo_documento: 0,
tipo_servico: 6,
uf_emitente: "BA",
uf_envio: "GO",
uf_fim: "MG",
uf_inicio: "GO",
uf_tomador: "PR",
valor_desconto_fatura: "0.00",
valor_inss: "0.10",
valor_liquido_fatura: "1.00",
valor_original_fatura: "1.00",
valor_receber: "1.00",
valor_total: "1.00",
valor_total_tributos: "0.00"
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, "")
# convertemos os dados da nota para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = cte.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interno do CTe.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/cte_os?ref=" + ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API.
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var cte = {
"bairro_emitente":"S\u00e3o Cristov\u00e3o",
"bairro_tomador":"Bacacheri",
"cep_emitente":"99880077",
"cep_tomador":"88991188",
"cfop":"5353",
"cnpj_emitente":"51916585000125",
"cnpj_tomador":"51966818092777",
"codigo_municipio_emitente":"2927408",
"codigo_municipio_envio":"5200050",
"codigo_municipio_fim":"3100104",
"codigo_municipio_inicio":"5200050",
"codigo_municipio_tomador":"4106902",
"codigo_pais_tomador":"1058",
"complemento_emitente":"Andar 19 - sala 23",
"data_emissao":"2018-06-18T09:17:00",
"descricao_servico":"Descricao do seu servico aqui",
"documentos_referenciados":[
{
"data_emissao":"2018-06-10",
"numero":"1",
"serie":"1",
"subserie":"1",
"valor":"1.00"
}
],
"funcionario_emissor":"Nome do funcionario que fez a emissao",
"icms_aliquota":"17.00",
"icms_base_calculo":"1.00",
"icms_situacao_tributaria":"00",
"icms_valor":"0.17",
"indicador_inscricao_estadual_tomador":"9",
"inscricao_estadual_emitente":"12345678",
"logradouro_emitente":"Aeroporto Internacional de Salvador",
"logradouro_tomador":"Rua Jo\u00e3o Dalegrave",
"modal":"02",
"municipio_emitente":"Salvador",
"municipio_envio":"Abadia de Goi\u00e1s",
"municipio_fim":"Abadia dos Dourados",
"municipio_inicio":"Abadia de Goi\u00e1s",
"municipio_tomador":"Curitiba",
"natureza_operacao":"PREST. DE SERV. TRANSPORTE A ESTAB. COMERCIAL",
"nome_emitente":"ACME LTDA",
"nome_fantasia_emitente":"ACME",
"nome_fantasia_tomador":"Nome do tomador do servico aqui",
"nome_tomador":"NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"numero_emitente":"S/N",
"numero_fatura":"1",
"numero_tomador":"1",
"pais_tomador":"BRASIL",
"quantidade":"1.00",
"seguros_carga":[
{
"nome_seguradora":"Nome da seguradora aqui",
"numero_apolice":"12345",
"responsavel_seguro":4
}
],
"telefone_emitente":"4133336666",
"tipo_documento":0,
"tipo_servico":6,
"uf_emitente":"BA",
"uf_envio":"GO",
"uf_fim":"MG",
"uf_inicio":"GO",
"uf_tomador":"PR",
"valor_desconto_fatura":"0.00",
"valor_inss":"0.10",
"valor_liquido_fatura":"1.00",
"valor_original_fatura":"1.00",
"valor_receber":"1.00",
"valor_total":"1.00",
"valor_total_tributos":"0.00"
};
// Aqui fazermos a serializacao do JSON com os dados do CTe e enviamos para API.
request.send(JSON.stringify(cte));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
<?php
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br/";
$server = "https://homologacao.focusnfe.com.br";
// Substituir pela sua identificação interno do CTe.
$ref = "12345";
$login = "Token_obtido_no_cadastro_da_empresa";
$password = "";
$cte = array (
"bairro_emitente" => "S\u00e3o Cristov\u00e3o",
"bairro_tomador" => "Bacacheri",
"cep_emitente" => "99880077",
"cep_tomador" => "88991188",
"cfop" => "5353",
"cnpj_emitente" => "51916585000125",
"cnpj_tomador" => "51966818092777",
"codigo_municipio_emitente" => "2927408",
"codigo_municipio_envio" => "5200050",
"codigo_municipio_fim" => "3100104",
"codigo_municipio_inicio" => "5200050",
"codigo_municipio_tomador" => "4106902",
"codigo_pais_tomador" => "1058",
"complemento_emitente" => "Andar 19 - sala 23",
"data_emissao" => "2018-06-18T09:17:00",
"descricao_servico" => "Descricao do seu servico aqui",
"documentos_referenciados" => array(
array (
"data_emissao" => "2018-06-10",
"numero" => "1",
"serie" => "1",
"subserie" => "1",
"valor" => "1.00"
)
),
"funcionario_emissor" => "Nome do funcionario que fez a emissao",
"icms_aliquota" => "17.00",
"icms_base_calculo" => "1.00",
"icms_situacao_tributaria" => "00",
"icms_valor" => "0.17",
"indicador_inscricao_estadual_tomador" => "9",
"inscricao_estadual_emitente" => "12345678",
"logradouro_emitente" => "Aeroporto Internacional de Salvador",
"logradouro_tomador" => "Rua Jo\u00e3o Dalegrave",
"modal" => "02",
"municipio_emitente" => "Salvador",
"municipio_envio" => "Abadia de Goi\u00e1s",
"municipio_fim" => "Abadia dos Dourados",
"municipio_inicio" => "Abadia de Goi\u00e1s",
"municipio_tomador" => "Curitiba",
"natureza_operacao" => "PREST. DE SERV. TRANSPORTE A ESTAB. COMERCIAL",
"nome_emitente" => "ACME LTDA",
"nome_fantasia_emitente" => "ACME",
"nome_fantasia_tomador" => "Nome do tomador do servico aqui",
"nome_tomador" => "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
"numero_emitente" => "S/N",
"numero_fatura" => "1",
"numero_tomador" => "1",
"pais_tomador" => "BRASIL",
"quantidade" => "1.00",
"seguros_carga" => array(
array (
"nome_seguradora" => "Nome da seguradora aqui",
"numero_apolice" => "12345",
"responsavel_seguro" => 4
)
),
"telefone_emitente" => "4133336666",
"tipo_documento" => 0,
"tipo_servico" => 6,
"uf_emitente" => "BA",
"uf_envio" => "GO",
"uf_fim" => "MG",
"uf_inicio" => "GO",
"uf_tomador" => "PR",
"valor_desconto_fatura" => "0.00",
"valor_inss" => "0.10",
"valor_liquido_fatura" => "1.00",
"valor_original_fatura" => "1.00",
"valor_receber" => "1.00",
"valor_total" => "1.00",
"valor_total_tributos" => "0.00"
);
// Inicia o processo de envio das informações usando o cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/cte?ref=" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($cte));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//As três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema devera interpretar e lidar com o retorno.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/cte_os"
# Substituir pela sua identificação interno do CTe.
ref = {"ref":"12345"}
token="Token_obtido_no_cadastro_da_empresa"
'''
Usamos dicionarios para armazenar os campos e valores que em seguida,
serao convertidos em JSON e enviados para nossa API.
'''
cte_os = {}
seguros_carga = {}
documentos_referenciados ={}
cte_os["bairro_emitente"] = "S\u00e3o Cristov\u00e3o"
cte_os["bairro_tomador"] = "Bacacheri"
cte_os["cep_emitente"] = "99880077"
cte_os["cep_tomador"] = "88991188"
cte_os["cfop"] = "5353"
cte_os["cnpj_emitente"] = "51916585000125"
cte_os["cnpj_tomador"] = "51966818092777"
cte_os["codigo_municipio_emitente"] = "2927408"
cte_os["codigo_municipio_envio"] = "5200050"
cte_os["codigo_municipio_fim"] = "3100104"
cte_os["codigo_municipio_inicio"] = "5200050"
cte_os["codigo_municipio_tomador"] = "4106902"
cte_os["codigo_pais_tomador"] = "1058"
cte_os["complemento_emitente"] = "Andar 19 - sala 23"
cte_os["data_emissao"] = "2018-06-18T09:17:00"
cte_os["descricao_servico"] = "Descricao do seu servico aqui"
documentos_referenciados["data_emissao"] = "2018-06-10"
documentos_referenciados["numero"] = "1"
documentos_referenciados["serie"] = "1"
documentos_referenciados["subserie"] = "1"
documentos_referenciados["valor"] = "1.00"
cte_os["funcionario_emissor"] = "Nome do funcionario que fez a emissao"
cte_os["icms_aliquota"] = "17.00"
cte_os["icms_base_calculo"] = "1.00"
cte_os["icms_situacao_tributaria"] = "00"
cte_os["icms_valor"] = "0.17"
cte_os["indicador_inscricao_estadual_tomador"] = "9"
cte_os["inscricao_estadual_emitente"] = "12345678"
cte_os["logradouro_emitente"] = "Aeroporto Internacional de Salvador"
cte_os["logradouro_tomador"] = "Rua Jo\u00e3o"
cte_os["modal"] = "02"
cte_os["municipio_emitente"] = "Salvador"
cte_os["municipio_envio"] = "Abadia de Goi\u00e1s"
cte_os["municipio_fim"] = "Abadia dos Dourados"
cte_os["municipio_inicio"] = "Abadia de Goi\u00e1s"
cte_os["municipio_tomador"] = "Curitiba"
cte_os["natureza_operacao"] = "PREST. DE SERV. TRANSPORTE A ESTAB. COMERCIAL"
cte_os["nome_emitente"] = "ACME LTDA"
cte_os["nome_fantasia_emitente"] = "ACME"
cte_os["nome_fantasia_tomador"] = "Nome do tomador do servico aqui"
cte_os["nome_tomador"] = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"
cte_os["numero_emitente"] = "S/N"
cte_os["numero_fatura"] = "1"
cte_os["numero_tomador"] = "1"
cte_os["pais_tomador"] = "BRASIL"
cte_os["quantidade"] = "1.00"
seguros_carga["nome_seguradora"] = "Nome da seguradora aqui"
seguros_carga["numero_apolice"] = "12345"
seguros_carga["responsavel_seguro"] = "4"
cte_os["telefone_emitente"] = "4133336666"
cte_os["tipo_documento"] = "0"
cte_os["tipo_servico"] = "6"
cte_os["uf_emitente"] = "BA"
cte_os["uf_envio"] = "GO"
cte_os["uf_fim"] = "MG"
cte_os["uf_inicio"] = "GO"
cte_os["uf_tomador"] = "PR"
cte_os["valor_desconto_fatura"] = "0.00"
cte_os["valor_inss"] = "0.10"
cte_os["valor_liquido_fatura"] = "1.00"
cte_os["valor_original_fatura"] = "1.00"
cte_os["valor_receber"] = "1.00"
cte_os["valor_total"] = "1.00"
cte_os["valor_total_tributos"] = "0.00"
# Adicionamos os dados das variaveis seguros_carga e documentos_referenciados como listas ao dicionario principal.
cte_os["seguros_carga"] = [seguros_carga]
cte_os["documentos_referenciados"] = [documentos_referenciados]
r = requests.post(url, params=ref, data=json.dumps(cte_os), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API.
print(r.status_code, r.text)
Para enviar uma CTe utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Envia uma CTe para autorização:
https://api.focusnfe.com.br/v2/cte?ref=REFERENCIA
Utilize o comando HTTP POST para enviar a sua nota para nossa API. Envie como corpo do POST os dados em formato JSON da CTe.
Nesta etapa, é feita uma primeira validação dos dados da nota. Caso ocorra algum problema, por exemplo, algum campo faltante, formato incorreto ou algum problema com o emitente a nota não será aceita para processamento e será devolvida a mensagem de erro apropriada. Veja a seção erros.
Caso a nota seja validada corretamente, a nota será aceita para processamento. Isto significa que a nota irá para uma fila de processamento onde eventualmente será processada (processamento assíncrono). Com isto, a nota poderá ser autorizada ou ocorrer um erro na autorização, de acordo com a validação da SEFAZ.
Para verificar se a nota já foi autorizada, você terá que efetuar uma consulta.
Envia uma CTe OS para autorização:
https://api.focusnfe.com.br/v2/cte_os?ref=REFERENCIA
Utilize o comando HTTP POST para enviar a sua nota para nossa API. Ao contrátio da CTe convencional, a CTe OS é processada de forma síncrona, na mesma requição em que os dados são enviadas.
Consulta
curl -u "token obtido no cadastro da empresa:" \
https://homologacao.focusnfe.com.br/v2/cte/12345
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class Consulta {
public static void main(String[] args){
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interno do CTe. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/cte/"+ref+"?completa=1");
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.get(ClientResponse.class);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/cte/" + ref + "?completa=1"
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Get a partir da uri de requisição
requisicao = Net::HTTP::Get.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interno do CTe.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/cte/" + ref + "?completa=1";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API.
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('GET', url, false, token);
request.send();
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
<?php
// Substituir pela sua identificação interno do CTe.
$ref = "12345";
$login = "Token_obtido_no_cadastro_da_empresa";
$password = "";
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/cte/" . $ref."?completa=1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//As três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema devera interpretar e lidar com o retorno.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
# Faça o download e instalação da biblioteca requests, através do python-pip.
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/cte/"
# Substituir pela sua identificação interno do CTe.
ref = "12345"
token="Token_obtido_no_cadastro_da_empresa"
# Use este parametro para obter mais informacoes em suas consultas.
completa = "completa=1"
r = requests.get(url+ref, params=completa, auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API.
print(r.status_code, r.text)
Para consultar uma CTe utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Consultar as informações de uma CTe:
https://api.focusnfe.com.br/v2/cte/REFERENCIA?completa=(0|1)
Utilize o comando HTTP GET para consultar a sua nota para nossa API.
Parâmetro Opcional | Ação |
---|---|
completa = 0 ou 1 | Habilita a API há mostrar campos adicionais na requisição de consulta. |
Campos de retorno:
- cnpj_emitente: O CNPJ emitente da CTe (o CNPJ de sua empresa).
- ref:A referência da emissão.
- status: A situação da CTe, podendo ser:
- processando_autorizacao: A nota ainda está em processamento pela API. Você deverá aguardar o processamento pela SEFAZ.
- autorizado: A nota foi autorizada, neste caso é fornecido os dados completos da nota como chave e arquivos para download
- cancelado: O documento foi cancelado, neste caso é fornecido o caminho para download do XML de cancelamento (caminho_xml_cancelamento).
- erro_autorizacao: Houve um erro de autorização por parte da SEFAZ. A mensagem de erro você encontrará nos campos status_sefaz e mensagem_sefaz. É possível fazer o reenvio da nota com a mesma referência se ela estiver neste estado.
- denegado: O documento foi denegado. Uma SEFAZ pode denegar uma nota se houver algum erro cadastral nos dados do destinatário ou do emitente. A mensagem de erro você encontrará nos campos status_sefaz e mensagem_sefaz. Não é possível reenviar a nota caso este estado seja alcançado pois é gerado um número, série, chave de CTe e XML para esta nota. O XML deverá ser armazenado pelo mesmo período de uma nota autorizada ou cancelada.
- status_sefaz: O status da nota na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- serie: A série da CTe, caso ela tenha sido autorizada.
- numero: O número da CTe, caso ela tenha sido autorizada.
- modelo: O modelo da CTe, caso ela tenha sido autorizada.
- chave_cte: A chave da CTe, caso ela tenha sido autorizada.
- caminho_xml_nota_fiscal: caso a nota tenha sido autorizada, retorna o caminho para download do XML.
- caminho_dacte: caso a nota tenha sido autorizada retorna o caminho para download do DACTe.
- caminho_xml: caso tenha sido emitida alguma carta de correção, aqui aparecerá o caminho para fazer o download do XML.
- caminho_xml_carta_correcao: caso tenha sido emitida alguma carta de correção, aqui aparecerá o caminho para fazer o download do XML da carta.
- caminho_xml_cancelamento: Caso a nota esteja cancelada, é fornecido o caminho para fazer o download do XML de cancelamento.
Caso na requisição seja passado o parâmetro completo=1
será adicionado mais 6 campos:
- requisicao: Inclui os dados completos da requisição da CTe, da mesma forma que constam no XML da nota.
- protocolo: Inclui os dados completos do protocolo devolvido pela SEFAZ.
- requisicao_cancelamento: Inclui os dados completos da requisição de cancelamento da CTe.
- protocolo_cancelamento: Inclui os dados completos do protocolo devolvido pela SEFAZ.
- requisicao_carta_correcao: Inclui os dados completos da requisição de Carta de Correção Eletrônica da CTe.
- protocolo_carta_correcao: Inclui os dados completos do protocolo devolvido pela SEFAZ.
Exemplo de resposta da consulta de CTe:
{
"cnpj_emitente": "11111151000119",
"ref": "ref123",
"status": "autorizado",
"status_sefaz": "100",
"mensagem_sefaz": "Autorizado o uso do CT-e",
"chave": "CTe21111114611151000119570010000000111973476363",
"numero": "11",
"serie": "1",
"modelo": "57",
"caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/11111151000119/201805/XMLs/311110000007009_v03.00-protCTe.xml",
"caminho_xml_carta_correcao": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/11111151000119/201805/XMLs/311110000007012_v03.00-eventoCTe.xml"
}
Exemplo de resposta com o parâmetro, completa, recebendo o valor "1":
{
"cnpj_emitente": "11111151000119",
"ref": "ref123",
"status": "autorizado",
"status_sefaz": "100",
"mensagem_sefaz": "Autorizado o uso do CT-e",
"chave": "CTe21111114611151000119570010000000111973476363",
"numero": "11",
"serie": "1",
"modelo": "57",
"caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/11111151000119/201805/XMLs/311110000007009_v03.00-protCTe.xml",
"caminho_xml_carta_correcao": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/11111151000119/201805/XMLs/311110000007012_v03.00-eventoCTe.xml"
"requisicao": {
/* campos da CTe aqui omitida */
}
"protocolo": {
"versao": "3.00",
"id_tag": "CTe329180000007009",
"ambiente": "2",
"versao_aplicativo": "RS20180430143216",
"chave": "21111114611151000119570010000000111973476363",
"data_recimento": "2018-05-10T15:23:36-03:00",
"protocolo": "329180000007009",
"digest_value": "PsPzcf7bCOwvNW+v2F+ZAzJPXJE=",
"status": "100",
"motivo": "Autorizado o uso do CT-e"
},
"requisicao_carta_correcao": {
"versao": "3.00",
"id_tag": "ID21111114611151000119570010000000111973476363",
"codigo_orgao": "29",
"ambiente": "2",
"cnpj": "14674451000119",
"chave_cte": "21111114611151000119570010000000111973476363",
"data_evento": "2018-05-10T16:25:42-03:00",
"tipo_evento": "110110",
"numero_sequencial_evento": "1",
"versao_evento": "3.00"
},
"protocolo_carta_correcao": {
"versao": "3.00",
"id_tag": "ID329180000007012",
"ambiente": "2",
"versao_aplicativo": "RS20171205135830",
"codigo_orgao": "29",
"status": "135",
"motivo": "Evento registrado e vinculado a CT-e",
"chave_cte": "21111114611151000119570010000000111973476363",
"tipo_evento": "110110",
"descricao_evento": "Carta Correção Registrada",
"numero_sequencial_evento": "1",
"data_evento": "2018-05-10T16:25:43-03:00",
"protocolo": "329180000007012"
}
}
Cancelamento
import java.util.HashMap;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class Cancelar {
public static void main(String[] args){
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interno do CTe. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/cte/"+ref);
/* Aqui criamos um hashmap para receber a chave "justificativa" e o valor desejado. */
HashMap<String, String> justificativa = new HashMap<String, String>();
justificativa.put("justificativa", "Informe aqui a sua justificativa para realizar o cancelamento da NFe.");
/* Criamos um objeto JSON para receber a hash com os dados esperado pela API. */
JSONObject json = new JSONObject(justificativa);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.delete(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/cte/" + ref
# altere os campos conforme a nota que será enviada
justificativa_cancelamento = {
justificativa: "Informe aqui a sua justificativa para realizar o cancelamento da NFe."
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Delete a partir da uri de requisição
requisicao = Net::HTTP::Delete.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos a hash de justificativa do cancelamento para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = justificativa_cancelamento.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interno do CTe.
var ref = "12345";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/cte/"+ ref;
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da AP
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('DELETE', url, false, token);
var cancelar = {
"justificativa": "Sua justificativa aqui!"
};
// Aqui fazermos a serializacao do JSON com o campo de cancelamento e enviamos para API.
request.send(JSON.stringify(cancelar));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
<?php
$ch = curl_init();
// Substituir pela sua identificação interno do CTe.
$ref = "12345";
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br";
$justificativa = array ("justificativa" => "A sua justificativa de cancelamento aqui.");
$login = "Token_obtido_no_cadastro_da_empresa";
$password = "";
curl_setopt($ch, CURLOPT_URL, $server . "/v2/cte/" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($justificativa));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$result = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//As três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema devera interpretar e lidar com o retorno.
print($result."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/cte/"
# Substituir pela sua identificação interno do CTe.
ref = "12345"
token="Token_obtido_no_cadastro_da_empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API.
'''
justificativa={}
justificativa["justificativa"] = "Sua justificativa aqui!"
r = requests.delete(url+ref, data=json.dumps(justificativa), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API.
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
-X DELETE -d '{"justificativa":"Teste de cancelamento de nota"}' \
https://homologacao.focusnfe.com.br/v2/cte/12345
Resposta da API para a requisição de cancelamento:
{
"status_sefaz": "135",
"mensagem_sefaz": "Evento registrado e vinculado a CT-e",
"status": "cancelado",
"caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/14674451000119/201805/XMLs/329180000006929_v03.00-eventoCTe.xml"
}
Para cancelar uma CTe, basta fazer uma requisição à URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.
Cancelar uma CTe já autorizada:
https://api.focusnfe.com.br/v2/cte/REFERENCIA
Utilize o comando HTTP DELETE para cancelar a sua nota para nossa API. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.
O parâmetro de cancelamento deverá ser enviado da seguinte forma:
- justificativa: Justificativa do cancelamento. Deverá conter de 15 a 255 caracteres.
A API irá em seguida devolver os seguintes campos:
- status: cancelado, se a nota pode ser cancelada, ou erro_cancelamento, se houve algum erro ao cancelar a nota.
- status_sefaz: O status do cancelamento na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- caminho_xml: Caso a nota tenha sido cancelada, será informado aqui o caminho para download do XML de cancelamento.
Prazo de cancelamento
A CTe poderá ser cancelada em até 7 dias após a emissão, na maioria dos Estados.
Carta de Correção Eletrônica
Uma Carta de Correção eletrônica (CCe) pode ser utilizada para corrigir eventuais erros na CTe. As seguintes informações não podem ser corrigidas:
- As variáveis que determinam o valor do imposto tais como: base de cálculo, alíquota, diferença de preço, quantidade, valor da operação ou da prestação;
- A correção de dados cadastrais que implique mudança do remetente ou do destinatário;
- A data de emissão ou de saída.
Não existe prazo especificado para emissão de cartas de correção. É possível enviar até 20 correções diferentes, sendo que será válido sempre a última correção enviada.
Emissão de CCe
import java.util.HashMap;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class EmitirCce {
public static void main(String[] args){
String login = "Token_obtido_no_cadastro_da_empresa";
/* Substituir pela sua identificação interno do CTe. */
String ref = "12345";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/cte/"+ref+"/carta_correcao");
/* Aqui criamos um hashmap para receber a chave "correcao" e o valor desejado. */
HashMap<String, String> correcao = new HashMap<String, String>();
correcao.put("campo_corrigido", "uf_inicio");
correcao.put("valor_corrigido", "PR");
/* Criamos um objeto JSON para receber a hash com os dados esperado pela API. */
JSONObject json = new JSONObject(correcao);
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# referência da nota - deve ser única para cada nota enviada
ref = "id_referencia_nota"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/cte/" + ref + "/carta_correcao"
# altere os campos conforme a nota que será enviada
correcao = {
campo_correcao: "Informe aqui o titulo do campo que será corrigido na CTe.",
valor_correcao: "Informe aqui o valor para o campo que será corrigido."
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos a hash de justificativa do cancelamento para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = correcao.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
// Substituir pela sua identificação interno do CTe.
var ref = "12345";
var cce = {"campo_corrigido": "uf_inicio", "valor_corrigido": "PR"};
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/cte/"+ ref + "/carta_correcao";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API.
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
// Aqui fazermos a serializacao do JSON com os campos de CCe e enviamos para API.
request.send(JSON.stringify(cce));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
<?php
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br";
// Substituir pela sua identificação interno do CTe.
$ref = "12345";
$login = "Token_obtido_no_cadastro_da_empresa";
$password = "";
$correcao = array (
"campo_corrigido" => "uf_inicio",
"valor_corrigido" => "PR"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server . "/v2/cte/" . $ref . "/carta_correcao");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($correcao));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//As três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema devera interpretar e lidar com o retorno.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/cte/"
# Substituir pela sua identificação interno do CTe.
ref = "12345"
token="Token_obtido_no_cadastro_da_empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API.
'''
cce = {"campo_corrigido": "uf_inicio", "valor_corrigido": "PR"}
r = requests.post(url+ref+"/carta_correcao", data=json.dumps(cce), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API.
print(r.status_code, r.text)
curl -u "token obtido no cadastro da empresa:" \
-X POST -d '{"campo_corrigido":"observacoes","valor_corrigido":"Nova observação"}' \
https://homologacao.focusnfe.com.br/v2/cte/12345/carta_correcao
Resposta da API para a requisição de CCe:
{
"status_sefaz": "135",
"mensagem_sefaz": "Evento registrado e vinculado a CT-e",
"status": "autorizado",
"caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/11111151000119/201805/XMLs/321110000006913_v03.00-eventoCTe.xml",
"numero_carta_correcao": 2
}
https://api.focusnfe.com.br/v2/cte/REFERENCIA/carta_correcao
Utilize o comando HTTP POST para enviar a sua correção para nossa API. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.
Ao contrário da NFe, na CTe é obrigatório informar especificamente o campo que será alterado. Você poderá usar os próprios nomes dos campos da API.
O parâmetros da carta de correção deverão ser enviados da seguinte forma:
- grupo_corrigido: Opcional. Indica o grupo onde se encontra o campo, por exemplo "cargas". Pode ser omitido se não houver grupo relacionado.
- campo_corrigido: Indica o campo a ser corrigido.
- valor_corrigido: Indica o novo valor do campo.
- numero_item_grupo_corrigido: Opcional. Caso o campo pertença a uma lista de itens, o número do item a ser corrigido é informado aqui. O primeiro número começa em 1.
- campo_api: Opcional. Se igual a 1 será usado o nome do campo da API nos campos 'grupo_corrigido' e 'campo_corrigido'. Se igual a 0 você deverá informar a tag XML. Valor default é 1.
A API irá em seguida devolver os seguintes campos:
- status: autorizado, se a carta de correção foi aceita pela SEFAZ, ou erro_autorizacao, se houve algum erro ao cancelar a nota.
- status_sefaz: O status da carta de correção na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- caminho_xml: Informa o caminho do XML da carta de correção, caso ela tenha sido autorizada.
- numero_carta_correcao: Informa o número da carta de correção, caso ela tenha sido autorizada.
Para uma mesma CTe é possível enviar mais de uma carta de correção, sendo que a última sempre substitui a anterior.
Inutilização
import java.util.HashMap;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class Inutilizar {
public static void main(String[] args) throws JSONException{
String login = "Token_obtido_no_cadastro_da_empresa";
/* Para ambiente de produção use a variável abaixo:
String server = "https://api.focusnfe.com.br/"; */
String server = "https://homologacao.focusnfe.com.br/";
String url = server.concat("v2/cte/inutilizacao");
/* Aqui criamos um hash que irá receber as chaves e valores esperados para gerar a inutilização. */
HashMap<String, String> dadosInutilizacao = new HashMap<String, String>();
dadosInutilizacao.put("cnpj", "51916585000125");
dadosInutilizacao.put("serie", "1");
dadosInutilizacao.put("numero_inicial", "1");
dadosInutilizacao.put("numero_final", "3");
dadosInutilizacao.put("justificativa", "Informe aqui a justificativa para realizar a inutilizacao da numeracao.");
dadosInutilizacao.put("modelo", "67");
/* Criamos um objeto JSON que irá receber o input dos dados, para então enviar a requisição. */
JSONObject json = new JSONObject (dadosInutilizacao);
/* Testar se o JSON gerado está dentro do formato esperado.
System.out.print(json); */
/* Configuração para realizar o HTTP BasicAuth. */
Object config = new DefaultClientConfig();
Client client = Client.create((ClientConfig) config);
client.addFilter(new HTTPBasicAuthFilter(login, ""));
WebResource request = client.resource(url);
ClientResponse resposta = request.post(ClientResponse.class, json);
int httpCode = resposta.getStatus();
String body = resposta.getEntity(String.class);
/* As três linhas abaixo imprimem as informações retornadas pela API.
* Aqui o seu sistema deverá interpretar e lidar com o retorno. */
System.out.print("HTTP Code: ");
System.out.print(httpCode);
System.out.printf(body);
}
}
# encoding: UTF-8
require "net/http"
require "net/https"
require "json"
# token enviado pelo suporte
token = "codigo_alfanumerico_token"
# endereço da api que deve ser usado conforme o ambiente: produção ou homologação
servidor_producao = "https://api.focusnfe.com.br/"
servidor_homologacao = "https://homologacao.focusnfe.com.br/"
# no caso do ambiente de envio ser em produção, utilizar servidor_producao
url_envio = servidor_homologacao + "v2/cte/inutilizacao"
# altere os campos conforme a nota que será enviada
dados_inutilizacao = {
cnpj: "51916585000125",
serie: "1",
numero_inicial: "1",
numero_final: "3",
justificativa: "Informe aqui a justificativa para realizar a inutilizacao da numeracao.",
modelo: "67"
}
# criamos um objeto uri para envio da nota
uri = URI(url_envio)
# também criamos um objeto da classe HTTP a partir do host da uri
http = Net::HTTP.new(uri.hostname, uri.port)
# aqui criamos um objeto da classe Post a partir da uri de requisição
requisicao = Net::HTTP::Post.new(uri.request_uri)
# adicionando o token à requisição
requisicao.basic_auth(token, '')
# convertemos a hash de justificativa do cancelamento para o formato JSON e adicionamos ao corpo da requisição
requisicao.body = dados_inutilizacao.to_json
# no envio de notas em produção, é necessário utilizar o protocolo ssl
# para isso, basta retirar o comentário da linha abaixo
# http.use_ssl = true
# aqui enviamos a requisição ao servidor e obtemos a resposta
resposta = http.request(requisicao)
# imprimindo o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code
# imprimindo o corpo da resposta
puts "Corpo da resposta: " + resposta.body
/*
As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
Here's how to include the module in your project and use as the browser-based XHR object.
Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
*/
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var request = new XMLHttpRequest();
var token = "Token_obtido_no_cadastro_da_empresa";
/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/cte/inutilizacao";
/*
Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);
var inutiliza = {
"cnpj": "14674451000119",
"serie": "1",
"numero_inicial": "700",
"numero_final": "703",
"justificativa": "Teste de inutilizacao de nota",
"modelo": 67
};
// Aqui fazermos a serializacao do JSON com os de inutilizacao e enviamos para API.
request.send(JSON.stringify(inutiliza));
// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);
<?php
// Para ambiente de produção use a variável abaixo:
// $server = "https://api.focusnfe.com.br";
$server = "https://homologacao.focusnfe.com.br";
$login = "Token_obtido_no_cadastro_da_empresa";
$password = "";
$inutiliza = array (
"cnpj" => "51916585000125",
"serie" => "1",
"numero_inicial" => "1",
"numero_final" => "3",
"justificativa" => "A sua justificativa de cancelamento aqui.",
"modelo" => 67
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/cte/inutilizacao");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($inutiliza));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$body = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//As três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema devera interpretar e lidar com o retorno.
print($http_code."\n");
print($body."\n\n");
print("");
curl_close($ch);
?>
# Faça o download e instalação da biblioteca requests, através do python-pip.
import json
import requests
'''
Para ambiente de produção use a variável abaixo:
url = "https://api.focusnfe.com.br"
'''
url = "https://homologacao.focusnfe.com.br/v2/cte/inutilizacao"
token="Token_obtido_no_cadastro_da_empresa"
'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API.
'''
inutilizacao={}
inutilizacao["cnpj"] = "51916585000125"
inutilizacao["serie"] = "1"
inutilizacao["numero_inicial"] = "1"
inutilizacao["numero_final"] = "3"
inutilizacao["justificativa"] = "Justificativa da inutilizacao minimo 15 caracteres"
inutilizacao["modelo"] = "67"
r = requests.post(url, data=json.dumps(inutilizacao), auth=(token,""))
# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API.
print(r.status_code, r.text)
Resposta da API para a requisição de inutilização:
{
"status_sefaz": "102",
"mensagem_sefaz": "Inutilizacao de numero homologado",
"serie": "3",
"numero_inicial": "800",
"numero_final": "801",
"status": "autorizado",
"caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/11111353000900/207701/XMLs/999992335309999955003000000800000000801-inu.xml"
}
Em uma situação normal você não precisará informar ao SEFAZ a inutilização de um número da CTe, pois a API controla automaticamente a numeração das notas. Porém, se por alguma situação específica for necessário a inutilização de alguma faixa de números você poderá chamar as seguintes operações:
Envio de inutilização de faixa de numeração:
https://api.focusnfe.com.br/v2/cte/inutilizacao
Utilize o comando HTTP POST para enviar a sua inutilização para nossa API. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.
A inutilização precisa dos seguintes parâmetros obrigatórios:
- cnpj: CNPJ da empresa emitente
- serie: Série da numeração da CTe que terá uma faixa de numeração inutilizada
- numero_inicial: Número inicial a ser inutilizado
- numero_final: Número final a ser inutilizado
- justificativa: Justificativa da inutilização (mínimo 15 caracteres)
- modelo: Informe o modelo da CTe. Se igual a 57 será a CTe normal, se igual a 67 será a CTe OS. Valor default é 57.
A API irá enviar uma resposta com os seguintes campos:
- status: autorizado, se a inutilização foi aceita pela SEFAZ, ou erro_autorizacao, se houve algum erro ao inutilizar os números.
- status_sefaz: O status da carta de correção na SEFAZ.
- mensagem_sefaz: Mensagem descritiva da SEFAZ detalhando o status.
- serie: Série da numeração da CTe que terá uma faixa de numeração inutilizada
- numero_inicial: Número inicial a ser inutilizado
- numero_final: Número final a ser inutilizado
- caminho_xml: Caminho do XML para download caso a inutilização tenha sido autorizada pela SEFAZ.
MDF-e (beta)
A MDF-e (Manifesto Eletrônico de Documentos Fiscais) é utilizada para rastrear a circulação física da carga em transportes interestaduais, transporte de carga fracionada ou por transporte de bens que utilizam mais de uma NFe.
As seguintes operações estão disponíveis:
- Emissão de MDF-e com geração da DAMDF-e
- Inclusão de condutor
- Cancelamento de MDF-e
- Encerramento de MDF-e
Através da API MDF-e é possível:
- Emitir MDF-e (Conhecimento de Transporte Eletrônico) utilizando dados simplificados. Este processo é assíncrono. Ou seja, após a emissão a nota será enfileirada para processamento.
- Cancelar uma MDF-e
- Consultar o status de MDF-e emitidas.
- Emitir os eventos: inclusão de condutor e encerramento.
URLs
Método | URL (recurso) | Ação |
---|---|---|
POST | /v2/mdfe?ref=REFERENCIA | Cria uma MDF-e e envia para processamento. |
GET | /v2/mdfe/REFERENCIA | Consulta a MDF-e com a referência informada e o seu status de processamento |
DELETE | /v2/mdfe/REFERENCIA | Cancela uma MDF-e com a referência informada |
POST | /v2/mdfe/REFERENCIA/inclusao_condutor | Inclui um novo condutor. |
POST | /v2/mdfe/REFERENCIA/encerramento | Encerra uma MDF-e |
Campos de um MDF-e
Abaixo um exemplo de dados de uma MDF-e:
{
"modal_aereo": {
"marca_nacionalidade_aeronave": "ABCD",
"marca_matricula_aeronave": "123456",
"numero_voo": "AB1234",
"aerodromo_embarque": "OACI",
"aerodromo_destino": "OACI",
"data_voo": "2018-06-15"
},
"emitente": "1",
"tipo_transporte": "1",
"serie": "1",
"modo_transporte": "2",
"data_emissao": "2019-01-30",
"uf_inicio": "BA",
"uf_fim": "PR",
"municipios_carregamento": [
{
"codigo": "2927408",
"nome": "Salvador"
}
],
"percursos": [
{
"uf_percurso": "PR"
}
],
"data_hora_previsto_inicio_viagem": "2019-01-16",
"cnpj_emitente": "22274451000119",
"inscricao_estadual_emitente": "25231737",
"municipios_descarregamento": [
{
"codigo": "4119152",
"nome": "Pinhais",
"conhecimentos_transporte": [
{
"chave_cte": "21111100317911000149570011000000051123456786"
}
]
}
],
"quantidade_total_cte": 1,
"valor_total_carga": "20000.00",
"codigo_unidade_medida_peso_bruto": "01",
"peso_bruto": "11.0000"
}
Abaixo você poderá consultar os campos da MDF-e. Nesta página, você pode buscar os campos pela TAG XML ou pela nossa tradução para API.
Documentação completa dos campos MDF-e
Além dos campos descritos acima, cada MDF-e deverá obrigatoriamente informar um modal, que é a forma de transporte da carga. Você deverá informar uma das seguintes chaves nos dados, clique em cada link para visualizar os campos completos:
- modal_rodoviario para transporte rodoviário.
- modal_aereo para transporte aéreo.
- modal_aquaviario para transporte aquaviário.
- modal_ferroviario para transporte ferroviário.
Status API
Aqui você encontra os status possíveis
HTTP CODE/STATUS | Status API Focus | Descrição | Correção |
---|---|---|---|
422 - unprocessable entity | erro_validacao_schema | Erro na validação do Schema XML | Verifique o detalhamento do erro na resposta da API. |
400 - bad request | forma_emissao_invalida | A forma de emissão utilizada é inválida | As formas de emissão disponíveis estão contidas na documentação da API. |
400 - bad request | campos_invalidos | OCampo 'X não é válido | Onde X é o nome do campo inválido. Verifique a documentação dos campos da API para MDF-e. |
400 - bad request | campos_invalidos_modal | Esse status indica erros nos campos do modal usado. Verifique os campos informados e compare com a nossa documentação de campos. | |
400 - bad request | empresa_nao_habilitada | Empresa ainda não habilitada para emissão de MDF-e | Verifique o cadastro do emitente no Painel API, deve-se habilitar MDF-e para começar a emitir este documento. |
409 - conflict | mdfe_ja_autorizado | Já existe um MDF-e autorizado utilizando esta referência | Altere a referência da requisição e tente novamente. |
409 - conflict | mdfe_em_processamento | Já existe um MDF-e utilizando essa referencia e ele está em processamento | Altere a referência da requisição e tente novamente. |
404 - not found | nao_encontrado | MDF-e não encontrado | MDF-e informado na requisição não foi encontrado. |
400 - bad request | requisicao_invalida | Sua requisição é inválida porque alguns dos paramêtros básicos não foram cumpridos. Entre em contato com o nosso suporte. |