NAV
shell php java ruby python javascript

Introdução

A API da 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 da Focus NFe, caso alguma dúvida permaneça você pode entrar em contato com o suporte especializado através do e-mail suporte@focusnfe.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 e webhooks. 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 empresas.

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:

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:

  1. Você envia pela API os dados do documento
  2. 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:

  1. Você envia pela API os dados do documento
  2. 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.
  3. Sua aplicação irá fazer uma nova consulta para verificar o status do processamento
  4. 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.
  5. 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/webhooks. 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:

  1. Você envia pela API os dados do documento
  2. 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.
  3. 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:

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:

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:

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
POST /v2/nfe/importacao?ref=REFERENCIA Cria uma nota fiscal a partir da importação de um XML
POST /v2/nfe/danfe Gera uma DANFe de Preview

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

0 – Nota Fiscal de Entrada;

1 – Nota Fiscal de Saída.

1 – Operação interna;

2 – Operação interestadual;

3 – Operação com exterior.

1 – Normal;

2 – Complementar;

3 – Nota de ajuste;

4 – Devolução.

0 – Normal;

1 – Consumidor final.

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

1 – Simples Nacional;

2 – Simples Nacional – excesso de sublimite de receita bruta;

3 – Regime Normal.

Destinatário

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:

0 – Não;

1 – Sim.

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;

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;

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;

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/webhooks.

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
    }
  ]
}

Envio síncrono

É possível configurar a empresa para realizar a emissão síncrona. Contate o suporte técnico para alterar o tipo de emissão de sua empresa.

Este tipo de emissão pode ser útil para pequenos envios que necessitam de autorização em tempo real. Para emissão de grandes lotes, recomendamos o uso da emissão assíncrona.

Quando a emissão é síncrona, será feita uma tentativa de envio e caso a nota tenha sido autorizada será devolvido o resultado do processamento na mesma requisição com o código de status HTTP 201 (Created). Caso ocorra algum erro, como por exemplo se o servidor da SEFAZ estiver fora do ar, a nota é enfileirada da mesma forma que o envio assíncrono.

Alguns estados não aceitam a emissão síncrona, são eles: SP, GO e BA.

Tipo de Emissão Status HTTP se sucesso Resposta Observações
assíncrona (default) 202 - Accepted Dados da nota com status processando_autorizacao Necessário consultar a nota posteriormente ou utilizar webhooks para receber o resultado do processamento
síncrona 201 - Created Dados da nota autorizada ou mensagem de erro A emissão síncrona pode não estar disponível, neste caso será devolvido código de status 202 - Accepted e a nota será enfileirada

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:

Caso na requisição seja passado o parâmetro completa=1 será adicionado mais 6 campos:

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:

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:

A API irá em seguida devolver os seguintes campos:

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:

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:

A API irá em seguida devolver os seguintes campos:

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@focusnfe.com.br");
    listaEmails.put("email_02@focusnfe.com.br");
    listaEmails.put("email_03@focusnfe.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@focusnfe.com.br", "email_02@focusnfe.com.br", "email_03@focusnfe.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@focusnfe.com.br", "email2@focusnfe.com.br", "email3@focusnfe.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@focusnfe.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:

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:

A API irá enviar uma resposta com os seguintes campos:

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",
  "protocolo_sefaz": "135210002233889"
}

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:

  1. Enviar os arquivos de NFe que estão no diretório de envio e criar uma pendência de retorno para esta nota.
  2. Enviar os arquivos de cancelamento que estão no diretório de envio e criar uma pendência de retorno para este cancelamento.
  3. Consultando os retornos pendentes.
    1. 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.
    2. 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 .

Importação

Para importar uma NFe a partir de seu XML utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja importando notas de teste.

Importação do XML de uma NFe:

https://api.focusnfe.com.br/v2/nfe/importacao?ref=REFERENCIA

Utilize o comando HTTP POST para importar a sua nota para nossa API. Envie como corpo do POST o conteúdo do arquivo XML. O campo de referência (ref) pode ser omitido, neste caso iremos considerar o valor da chave da nota.

Na importação é feita apenas a validação da empresa emitente, esta empresa deve estar cadastrada previamente para aceitar as importações. Não há necessidade de ter um certificado digital instalado para aceitar a importação.

Caso a nota seja validada corretamente, a nota será importada e estará disponível para receber outras operações como cancelamento ou carta de correção. Para realizar estas operações será necessário que a empresa tenha um certificado digital.

Os dados devolvidos após a importação com sucesso são os mesmos da operação de consulta

Exemplos de respostas da API

Importação realizada com sucesso

{
  "cnpj_emitente": "07504505000132",
  "ref": "NFe41190607504505000132550010000000221923094166",
  "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 na validação do XML

{
  "codigo": "erro_validacao_xml",
  "mensagem": "O XML não pode ser interpretado, verifique seu conteúdo e tente novamente"
}
# arquivo.xml deve conter o XML da NFe
curl -u "token obtido no cadastro da empresa:" \
  -X POST -T arquivo.xml https://homologacao.focusnfe.com.br/v2/nfe/importacao

Pré-visualização de DANFe

Exemplo de envio

# O "arquivo.json" deve conter os dados da NFe.
curl -u "token obtido no cadastro da empresa:" \
  -X POST -T arquivo.json https://api.focusnfe.com.br/v2/nfe/danfe
<?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://api.focusnfe.com.br";

$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"
    )
  ),
);

$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/danfe");
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 NFeDanfe {

  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/danfe");

    /* 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 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/danfe"

# 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
# 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/danfe"

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, 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)
/*
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/danfe";

/*
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);

Exemplo de um arquivo JSON

{
  "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"
    }
  ]
}

Erro na validação do XML

{
  "codigo": "erro_validacao_xml",
  "mensagem": "O XML não pôde ser interpretado, verifique seu conteúdo e tente novamente"
}

Para gerar a DANFe de preview para uma nota fiscal eletrônica, utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.

Gera uma DANFe:

https://api.focusnfe.com.br/v2/nfe/danfe

Utilize o comando HTTP POST para gerar a DANFe de preview. Envie como corpo do POST os dados em formato JSON da nota fiscal, ou o conteúdo de um arquivo XML.

A resposta da API incluirá o arquivo de DANFe de preview gerado, que pode ser visualizado e baixado.

NFCe

Através da API NFCe é possível:

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.
modalidade_frete numérico sim 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.
local_destino numérico sim Local onde a operação irá acontecer. Valores possíveis: '1' – Operação interna; '2' – Operação interestadual; '3' – Operação com exterior.

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.
indicador_inscricao_estadual_destinatario numérico não 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

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 Alguns 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. Alguns 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. Para NFCe no Ceará é obrigatório informar o campo nome_credenciadora, veja as condições em CFe SAT. 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 em algumas UFs 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:

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:

É possível que uma nota emitida em contingência não possa ser efetivada devido a erros no XML (como por exemplo, NCM incorreto ou impostos inconsistentes). Neste caso tanto o número da nota original quanto o número da nota em contingência serão inutilizados automaticamente.

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:

  1. 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)
  2. 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:

Usando esta forma de emissão, a SEFAZ irá autorizar notas mesmo com a data de emissão retroativa.

Tratativa de erros de timeout em estados onde não há contingência offline

Exemplo de NFCe com correção de timeout

{
  "cnpj_emitente": "28999399000136",
  "ref": "46262079",
  "status": "autorizado",
  "status_sefaz": "100",
  "mensagem_sefaz": "Autorizado o uso da NF-e",
  "chave_nfe": "NFe35230428199999000136650010009920901420209841",
  "numero": "90",
  "serie": "1",
  "protocolo": "135230310999953",
  "caminho_xml_nota_fiscal": "/arquivos/28999399000136/202304/XMLs/35230428199999000136650010009920901420209841-nfe.xml",
  "caminho_danfe": "/notas_fiscais_consumidor/NFe35230428199999000136650010009920901420209841.html",
  "qrcode_url": "https://www.nfce.fazenda.sp.gov.br/?p=NFe35230428199999000136650010009920901420209841",
  "url_consulta_nf": "https://www.nfce.fazenda.sp.gov.br/consulta",
  "tentativas_anteriores": [
    {
      "status": "cancelado",
      "chave_nfe": "NFe35230999999999000136650010009920881211857222",
      "numero": "88",
      "serie": "1",
      "protocolo": "135230310368696",
      "caminho_xml_nota_fiscal": "/arquivos/28165341000136/202304/XMLs/35230999999999000136650010009920881211857222-nfe.xml",
      "caminho_xml_cancelamento": "/arquivos/28165341000136/202304/XMLs/35230999999999000136650010009920881211857222-can.xml"
    }
  ]
}

Em estados como São Paulo (sem contingência offline), pode acontecer da SEFAZ ficar indisponível e devolver erro de timeout na emissão de NFCe, mas ainda assim autorizar a nota. Nestas situações a NFCe é automaticamente cancelada quando detectamos esta situação. Podemos levar algum tempo para ter a confirmação da duplicidade, dependendo da disponibilidade da SEFAZ, mas todas as notas emitidas sem o conhecimento da API serão canceladas.

Ao consultar a NFCe, os dados de cancelamento serão encontrados na chave tentativas_anteriores Você pode criar um webhook com o evento nfce_correcao_timeout para ser notificado dessas ocorrências.

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):

{
  "cnpj_emitente": "07504505000132",
  "ref": "07504505000132_NFCE_000001",
  "status": "autorizado",
  "status_sefaz": "100",
  "mensagem_sefaz": "Autorizado o uso da NF-e",
  "chave_nfe": "NFe42210607504505000132650010000000541799075218",
  "numero": "524",
  "serie": "1",
  "caminho_xml_nota_fiscal": "/arquivos_development/07504505000132/202106/XMLs/42210607504505000132650010000000541799075218-nfe.xml",
  "caminho_danfe": "/notas_fiscais_consumidor/NFe42210607504505000132650010000000541799075218.html",
  "qrcode_url": "https://hom.sat.sef.sc.gov.br/nfce/consulta?p=42210607504505000132650010000000541799075218|2|2|1|EB75B2FF9C11198DF1093E9582AB7F1A9B08D518",
  "url_consulta_nf": "https://hom.sat.sef.sc.gov.br/nfce/consulta"
}

Campos de retorno:

Caso na requisição seja passado o parâmetro completa=1 será adicionado mais 6 campos:

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",
  "numero_protocolo": "141230000025397"
}

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:

A API irá em seguida devolver os seguintes campos:

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",
  "numero_protocolo": "141230000025397"
}

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:

A API irá enviar uma resposta com os seguintes campos:

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@focusnfe.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@focusnfe.com.br");
    listaEmails.put("email_02@focusnfe.com.br");
    listaEmails.put("email_03@focusnfe.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@focusnfe.com.br", "email_02@focusnfe.com.br", "email_03@focusnfe.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@focusnfe.com.br", "email2@focusnfe.com.br", "email3@focusnfe.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:

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.

Comunicador Offline

O Comunicador Offline Focus NFe consiste em uma aplicação desktop que permite a emissão de NFCe e CFe (SAT e MFe) de maneira simplificada, voltada especialmente para usuários de tecnologias que não permitem o acesso à API via Web Services ou que não desejam programar o acesso HTTP, podendo assim utilizar um sistema de processamento de diretórios para emissão de documentos fiscais. Ainda, a aplicação também disponibiliza uma API local para usuários que prefiram uma comunicação direta entre sistemas. As especificações descritas nessa seção são válidas para a build 3.0.0 e posteriores do executável.

Visão Geral

O Comunicador Offline Focus NFe, quando executado, consulta o conteúdo de diretórios com descrições especificas que podem ser criados a partir de um caminho válido configurado pelo usuário. Chamamos esses diretórios de 'Diretórios de Comunicação'. Desta forma, basta um software terceiro criar um arquivo em um diretório específico, contendo o JSON com os dados necessários, para emitir a nota. O Comunicador Offline Focus NFe por sua vez consulta este diretório, processa o conteúdo e retorna o resultado nos demais 'Diretórios de Comunicação' descritos na sequência. O mesmo ocorre caso seja optada a comunicação via API Local, desconsideramos do processo apenas a leitura de um arquivo no diretório de input.

Abaixo a descrição de cada 'Diretório de Comunicação' e a sua finalidade:

Observação: A geração do PDF foi removida do fluxo de autorização de cupons. Isso significa que o mesmo só é gerado caso a opção de impressão direta esteja ativada na tela de configurações. Ainda, na tela de histórico de documentos fiscais, é possível obter individualmente o PDF e o XML dos documentos autorizados. Além disso, o PDF também pode ser obtido via requisição direta na API Local.

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 pelo MFe do Estado do Ceará e a Nota Fiscal de Consumidor Eletrônica ou NFCe que pode ser emitida em todos os Estados brasileiros.

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
Bematech RB 2000
Bematech SAT GO
Control ID SAT iD
Dimep D-SAT 2.0
Epson SAT A10
Tanca MFE TM-1000
Tanca SAT TS-1000
Gertec GerMFE
Sweda SS2000
Elgin Linker e Smart

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:

A partir disso, será possível utilizar o nosso Comunicador Offline Focus NFe. 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",
        }
    ],
    "formas_pagamento":[
      {
        "forma_pagamento": "03",
        "valor_pagamento": "0.50",
            "nome_credenciadora": "SAFRA"
      },
      {
        "forma_pagamento": "02",
        "valor_pagamento": "0.50",
            "nome_credenciadora": "AMEX"
      }
    ]
}

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
valor_desconto valor do Desconto sobre item 0.00
valor_outras_despesas valor Total de outras Despesas acessórias sobre Item 0.00
cest código CEST que identifica a mercadoria sujeita aos regimes de substituição tributária e de antecipação do recolhimento do imposto Campo omitido
informacoes_adicionais_item norma referenciada, informações complementares, etc. Campo omitido
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. Para emissão de CFe/NFCe no Ceará o campo nome_credenciadora é obrigatório se forma_pagamento for 03 ou 04 (pagamentos com cartões de crédito ou débito).

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.
nome_credenciadora nome da credenciadora do cartão de débito/crédito conforme tabela abaixo

Para mais detalhes sobre os valores possívels em forma_pagamento consulte nossa documentação de campos da API NFe/NFCe aqui.

Tabela de credenciadoras

nome_credenciadora Descrição
SICREDI Administradora de Cartões Sicredi Ltda.
SICREDIRS Administradora de Cartões Sicredi Ltda.(filial RS)
AMEX Banco American Express S/A - AMEX
GE BANCO GE - CAPITAL
SAFRA BANCO SAFRA S/A
TOPAZIO BANCO TOPÁZIO S/A
TRIANGULO BANCO TRIANGULO S/A
BIGCARD BIGCARD Adm. de Convenios e Serv.
BOURBON BOURBON Adm. de Cartões de Crédito
CABAL CABAL Brasil Ltda.
CETELEM CETELEM Brasil S/A - CFI
CIELO CIELO S/A
CREDI CREDI 21 Participações Ltda.
ECX ECX CARD Adm. e Processadora de Cartões S/A
EMBRATEC Empresa Bras. Tec. Adm. Conv. Hom. Ltda. - EMBRATEC
EMPORIO EMPÓRIO CARD LTDA
FREEDDOM FREEDDOM e Tecnologia e Serviços S/A
FUNCIONAL FUNCIONAL CARD LTDA.
HIPERCARD HIPERCARD Banco Multiplo S/A
MAPA MAPA Admin. Conv. e Cartões Ltda.
NOVO Novo Pag Adm. e Proc. de Meios Eletrônicos dePagto. Ltda.
PERNAMBUCANAS PERNAMBUCANAS Financiadora S/A Crédito, Fin.e Invest.
POLICARD POLICARD Systems e Serviços Ltda.
PROVAR PROVAR Negócios de Varejo Ltda.
REDECARD REDECARD S/A
RENNER RENNER Adm. Cartões de Crédito Ltda.
RP RP Administração de Convênios Ltda.
SANTINVEST SANTINVEST S/A Crédito, Financiamento e Investimentos
SODEXHO SODEXHO Pass do Brasil Serviços e Comércio S/A
SOROCRED SOROCRED Meios de Pagamentos Ltda.
TECBAN Tecnologia Bancária S/A - TECBAN
TICKET TICKET Serviços S/A
TRIVALE Unicard Banco Múltiplo S/A - TRICARD
TRICARD Unicard Banco Múltiplo S/A - TRICARD
OUTROS Outros

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 Comunicador Offline Focus NFe 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 Comunicador Offline Focus NFe 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 .cfecanc e, seu conteúdo será desconsiderado. A referência será utilizada para uma busca no banco de dados, cancelando a nota a qual se refere.

Após processado o cancelamento um arquivo com o nome formado por 'referencia + canc + timestamp' será gravado no diretório "retornos" contendo um JSON simples com o resultado da operação indicando se houve sucesso ou erro.

*Geração do Cupom Fiscal Eletrônico e XML *

Na tela de histórico de documentos fiscais, é possível gerar o PDF e/ou XML dos documentos de maneira individual. Também é possível gerar esses documentos utilizando uma rota específica da API local disponibilizada pelo Comunicador Offline Focus NFe.

NFCe

Para emissão da Nota Fiscal de Consumidor Eletrônica será necessário, primeiramente, o cumprimento das premissas abaixo:

A partir disso, será possível utilizar o nosso Comunicador Offline Focus NFe. 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 Comunicador Offline Focus NFe 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 Comunicador Offline Focus NFe não aceita duplicidade de referências, 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 referência já foi utilizada.

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 nome formado por 'referencia + canc + timestamp' 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

A reimpressão pode ser feita gerando manualmente o PDF na tela de histórico de documentos fiscais, assim basta acessar o diretório onde o arquivo foi salvo e imprimir o documento. Também é possível gerar esses documentos utilizando uma rota específica da API local disponibilizada pelo Comunicador Offline Focus NFe.

CFe MFe

Para emissão do Cupom Fiscal Eletrônico no estado do Ceará será necessário, primeiramente, o cumprimento das premissas abaixo:

Após a vinculação do Comunicador Offline 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 v2

# Consultar status
curl -XGET -T http://localhost:55555/v2/fiscal/sat/status

Exemplo de resposta da API local após consultar o status do equipamento:

{
  "status": "autorizado",
  "mensagem": "SAT em operação",
}
# Extrair logs
curl -XGET -T http://localhost:55555/v2/fiscal/sat/logs

Exemplo de resposta da API local após extrair os logs do equipamento:

{
  "status": "autorizado",
  "mensagem": "Transferência finalizada",
  "arquivo_log_base64": "...", # String em base64 contendo os logs retornados pelo equipamento
}
curl -XPOST  http://localhost:55555/v2/fiscal/sat?ref=REFERENCIA -T arquivo.json

Exemplo de resposta da API local após emissão do cupom fiscal pelo equipamento SAT/MFe:

{
  "ref": "REFERENCIA",
  "status": "autorizado",
  "mensagem": "Emitido com sucesso + conteudo notas.",
  "cpf_cnpj_emitente": "",
  "chave_nfe": "CFe77781082373077987991599000999380000289999993",
  "numero": "123",
}
curl -XDELETE http://localhost:55555/v2/fiscal/sat/REFERENCIA

Exemplo de resposta da API local após cancelamento do cupom fiscal pelo equipamento SAT/MFe:

{
  "ref": "REFERENCIA",
  "status": "cancelado",
  "mensagem": "Cupom cancelado com sucesso + conteudo CF-E-SAT cancelado.",
  "cpf_cnpj_emitente": "",
  "chave_nfe": "CFe77781082373077987991599000999380000289999993",
  "chave_nfe_cancelamento": "CFe35240108723218000186599000184591245710771581",
  "numero": "123","
}

Exemplo de requisição para geração do espelho do cupom fiscal:

curl -XGET  http://localhost:55555/v2/fiscal/sat/cfe/CHAVE_NFE.pdf

Exemplo de requisição para geração do XML do cupom fiscal:

curl -XGET  http://localhost:55555/v2/fiscal/sat/cfe/CHAVE_NFE.xml

Além do sistema de comunicação via diretórios, o Comunicador Offline Focus NFe também disponibiliza uma API local para comunicação direta. Através da API Local é possível:

URLs

Método URL (recurso) Ação
GET http://localhost:PORTA/v2/fiscal/sat/status Retorna o status do equipamento SAT/MFe.
GET http://localhost:PORTA/v2/fiscal/sat/logs Extrai os logs do equipamento SAT/MFe.
POST http://localhost:PORTA/v2/fiscal/sat?ref=REFERENCIA Emite um cupom fiscal eletrônico.
DELETE http://localhost:PORTA/v2/fiscal/sat/REFERENCIA Cancela um cupom fiscal eletrônico.
GET http://localhost:PORTA/v2/fiscal/sat/cfe/REFERENCIA Retorna os dados do CFe.
GET http://localhost:PORTA/v2/fiscal/sat/cfe/CHAVE_NFE.pdf Gera o espelho do cupom fiscal em PDF.
GET http://localhost:PORTA/v2/fiscal/sat/cfe/CHAVE_NFE.xml Gera o XML do cupom fiscal.
GET http://localhost:PORTA/v2/fiscal/sat/cfe/CHAVE_NFE-canc.xml Gera o XML do cupom fiscal cancelado.
POST http://localhost:PORTA/v2/fiscal/nfce?ref=REFERENCIA Emite uma NFCe.
DELETE http://localhost:PORTA/v2/fiscal/nfce/REFERENCIA Cancela uma NFCe.
GET http://localhost:PORTA/v2/fiscal/nfce/REFERENCIA Retorna os dados da NFCe.
GET http://localhost:PORTA/v2/fiscal/nfce/CHAVE_NFE.pdf Gera o espelho da NFCe em PDF.
GET http://localhost:PORTA/v2/fiscal/nfce/CHAVE_NFE.xml Gera o XML da NFCe.
GET http://localhost:PORTA/v2/fiscal/nfce/CHAVE_NFE-canc.xml Gera o XML da NFCe cancelada.

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 Offline 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.

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.

Gerar espelho PDF

A geração do espelho é feita com base no XML retornado pelo equipamento S@T/MFe e retornado na requisição em formato PDF.

Gerar XML referente ao cupom autorizado

A geração do XML é feita com base no XML retornado pelo equipamento S@T/MFe.

Emitir NFCe

A emissão de uma NFCe retorna um json com os detalhes da autorização feita pela API da Focus NFe.

Cancelar NFCe

O cancelamento de uma NFCe retorna um json com os detalhes do cancelamento feita pela API da Focus NFe.

Contingência NFCe (beta)

A Contingência NFCe é utilizada quando o estabelicimento não é capaz de se comunicar com a Sefaz. Isso pode ocorrer em situações de falta de conexão com a internet, indisponibilidade do Gateway ou indisponibilidade da Sefaz.

URLs

Método URL (recurso) Ação
POST http://localhost:PORTA/v2/fiscal/nfce?ref=REFERENCIA&tipo_contingencia=TIPO Emite uma NFCe offline (Contingência).
PUT http://localhost:PORTA/v2/fiscal/nfce/REFERENCIA/efetivar Tenta efetivar uma NFCe emitida em contingência.
GET http://localhost:PORTA/v2/fiscal/nfce/pendentes Lista todas as NFCes emitidas em contingência que não foram efetivadas.

Emissão de NFCe em contingência

Efetivação de NFCe emitida em contingência

API Remota (Beta)

# Consultar status
curl -XGET -T https://homologacao.focusnfe.com.br/v2/cfe/12345/status

Exemplo de resposta da API local após consultar o status do equipamento:

{
  "status": "autorizado",
  "mensagem": "SAT em operação",
}
# Extrair logs
curl -XGET -T https://homologacao.focusnfe.com.br/v2/cfe/12345/logs

Exemplo de resposta da API local após extrair os logs do equipamento:

{
  "status": "autorizado",
  "mensagem": "Transferência finalizada",
  "arquivo_log_base64": "...", # String em base 64 contendo os logs retornados pelo equipamento
}
curl -XPOST  https://homologacao.focusnfe.com.br/v2/cfe?ref=REFERENCIA&pos_id=12345 -T arquivo.json

Exemplo de resposta da API local após emissão do cupom fiscal pelo equipamento SAT/MFe:

{
  "ref": "REFERENCIA",
  "status": "autorizado",
  "mensagem": "Emitido com sucesso + conteudo notas.",
  "cpf_cnpj_emitente": "",
  "chave_nfe": "CFe77781082373077987991599000999380000289999993",
  "numero": "123",
}
curl -XDELETE https://homologacao.focusnfe.com.br/v2/cfe/REFERENCIA?pos_id=12345

Exemplo de resposta da API local após cancelamento do cupom fiscal pelo equipamento SAT/MFe:

{
  "ref": "REFERENCIA",
  "status": "cancelado",
  "mensagem": "Cupom cancelado com sucesso + conteudo CF-E-SAT cancelado.",
  "cpf_cnpj_emitente": "",
  "chave_nfe": "CFe77781082373077987991599000999380000289999993",
  "chave_nfe_cancelamento": "CFe35240108723218000186599000184591245710771581",
  "numero": "123","
}

Exemplo de requisição para geração do espelho do cupom fiscal:

curl -XGET https://homologacao.focusnfe.com.br/v2/cfe/CHAVE_NFE.pdf?pos_id=12345

Exemplo de requisição para geração do XML do cupom fiscal:

curl -XGET  https://homologacao.focusnfe.com.br/v2/cfe/CHAVE_NFE.xml?pos_id=12345

Além do sistema de comunicação via diretórios e API Local, também é possível utilizar a API remota oficial da Focus NFe. Para isso, é necessário que o usuário tenha acesso à internet e siga as instruções de autenticação descritas na introdução da documentação.

Através da API Remota é possível:

URLs

Método URL (recurso) Ação
GET https://homologacao.focusnfe.com.br/v2/cfe/IDENTIFICADOR/status Retorna o status do equipamento SAT/MFe.
GET https://homologacao.focusnfe.com.br/v2/cfe/IDENTIFICADOR/logs Extrai os logs do equipamento SAT/MFe.
POST https://homologacao.focusnfe.com.br/v2/cfe?ref=REFERENCIA&pos_id=IDENTIFICADOR Emite um cupom fiscal eletrônico.
DELETE https://homologacao.focusnfe.com.br/v2/cfe/REFERENCIA?pos_id=IDENTIFICADOR Cancela um cupom fiscal eletrônico.
GET https://homologacao.focusnfe.com.br/v2/cfe/REFERENCIA?pos_id=IDENTIFICADOR Retorna os dados do CFe.
GET https://homologacao.focusnfe.com.br/v2/cfe/CHAVE_NFE.pdf?pos_id=IDENTIFICADOR Gera o espelho do cupom fiscal em PDF.
GET https://homologacao.focusnfe.com.br/v2/cfe/CHAVE_NFE.xml?pos_id=IDENTIFICADOR Gera o XML do cupom fiscal.
GET https://homologacao.focusnfe.com.br/v2/cfe/CHAVE_NFE-canc.xml?pos_id=IDENTIFICADOR Gera o XML do cupom fiscal cancelado.

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 Offline 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.

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.

Gerar espelho PDF

A geração do espelho é feita com base no XML retornado pelo equipamento S@T/MFe e retornado na requisição em formato PDF.

Gerar XML referente ao cupom autorizado

A geração do XML é feita com base no XML retornado pelo equipamento S@T/MFe.

Download

Para ter acesso ao instalador do Comunicador Offline Focus NFe e ao código de ativação, entre em contato com a nossa equipe no email suporte@focusnfe.com.br

Caso você ainda não seja nosso cliente, cadastre-se aqui.

NFSe

Através da API NFSe é possível:

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. OBSERVAÇÃO: 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 as orientações a respeito das especificidades dos campos em sua cidade, em especial os destacados na sequência: * natureza_operacao * item_lista_servico * codigo_cnae * codigo_tributario_municipio

A listagem completa dos campos segue abaixo. Aqueles denotados com (*) são obrigatórios.

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@focusnfe.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
   }
}

Prestador

Tomador

Serviço

Intermediário

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: "contato@focusnfe.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@focusnfe.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@focusnfe.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 / webhooks.

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.

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:

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:

A API irá em seguida devolver os seguintes campos:

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@focusnfe.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@focusnfe.com.br");
    listaEmails.put("email_02@focusnfe.com.br");
    listaEmails.put("email_03@focusnfe.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@focusnfe.com.br", "email_02@focusnfe.com.br", "email_03@focusnfe.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@focusnfe.com.br", "email2@focusnfe.com.br", "email3@focusnfe.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:

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.

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@focusnfe.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: "contato@focusnfe.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@focusnfe.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@focusnfe.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:

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

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

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

De forma similar à manifestação de NFe, a API Focus para busca de NFSes Recebidas permite que você consulte notas de serviço em que sua empresa é a tomadora do serviço. Denominamos notas recebidas pois NFSe não contempla a operação de manifestação.

A recuperação de notas é possível apenas em municípios que disponibilizam a consulta de notas recebidas / tomadas - como São Paulo, Sorocaba, Barueri e outras dezenas de municípios integrados em nossa API.

A presente documentação deve ser suficiente para realizar a integração com a API do Focus NFe. Em caso de dúvidas, entre em contato com nosso excelente suporte pelo e-mail suporte@focusnfe.com.br. Neste canal você também pode verificar a viabilidade de integração de novos municípios.

URLs

Método URL (recurso) Ação
GET /v2/nfses_recebidas?cnpj=CNPJ Busca os dados de todas as NFSes recebidas para o CNPJ
GET /v2/nfses_recebidas/CHAVE Consulta a nota fiscal completa identificada pela chave informada

Status API

Aqui você encontra os status possíveis para NFSes Recebidas.

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

As NFSes recebidas possuem um campo chamado "versao", que é único entre todos os documentos recebidos do mesmo CNPJ. Isto permite buscar apenas documentos que seu sistema não conhece, mantendo um único número incremental por CNPJ.

Como uma NFSe pode ser cancelada após ter sido recebida, a versao associada é atualizada a cada alteração nesta NFSe. Por exemplo, se você recebe uma NFSe com versao: 60 e ela posteriormente for cancelada, a versão da NFSe será atualizada para algum número maior que 60.

A API busca notas recentes nas prefeituras duas vezes por dia. Atualizações retroativas, como cancelamentos de notas mais antigas, são buscadas aos finais de semana.

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 na URL:

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:

[
  {
    "chave": "NFSe859042900001504305108-5555-123456-DMMY000",
    "versao": 846,
    "status": "autorizado",
    "numero": "123456",
    "numero_rps": "789",
    "serie_rps": "S",
    "data_emissao": "2023-02-01T21:43:00-03:00",
    "data_emissao_rps": "2023-02-01T21:43:00-03:00",
    "codigo_verificacao": "DMMY000",
    "valor_servicos": "100.00",
    "documento_prestador": "85904290000150",
    "nome_prestador": "Fictício Prestador",
    "inscricao_municipal_prestador": "5555",
    "nome_municipio": "Caxias do Sul",
    "sigla_uf": "RS",
    "codigo_municipio": "4305108",
    "documento_tomador": "07504505000132",
    "url": "https://nfse.caxias.rs.gov.br/consulta/pdf?chaveAcesso=DMMY000",
    "url_xml": "https://focusnfe.s3.sa-east-1.amazonaws.com/arquivos/07504505000132/202302/NFSeRecebidas/NFSe859042900001504305108-5555-123456-DMMY000.xml"
  }
]

Dados Devolvidos

A API irá devolver os seguintes cabeçalhos HTTP:

Os dados devolvidos podem vir em dois formatos: modo simplificado (default) ou completo. Se utilizado o formato simplificado o corpo da resposta será um array de objetos em JSON no seguinte formato:

Você pode configurar o gatilho nfse_recebida para receber estes dados diretamente em sua aplicação, tão logo estejam disponíveis na API. Consulte a seção de Gatilhos / Webhooks.

Exemplo dos dados de resposta usando o parâmetro completa=1:

[
  {
    "chave": "NFSe859042900001504305108-5555-123456-DMMY000",
    "versao": 846,
    "status": "autorizado",
    "numero": "123456",
    "serie": "S",
    "codigo_verificacao": "DMMY000",
    "data_emissao": "2023-02-01T21:43:00-03:00",
    "numero_rps": "789",
    "serie_rps": "S",
    "tipo_rps": null,
    "data_emissao_rps": "2023-02-01T21:43:00-03:00",
    "natureza_operacao": null,
    "regime_especial_tributacao": "3",
    "optante_simples_nacional": false,
    "incentivador_cultural": null,
    "competencia": null,
    "numero_nfse_substituida": null,
    "outras_informacoes": null,
    "informacoes_adicionais_contribuinte": "VEICULO: AAA00000; MOTORISTA: JOSE OLIVEIRA;",
    "prestador": {
      "cpf": null,
      "cnpj": "85904290000150",
      "inscricao_municipal": "5555",
      "razao_social": "Fictício Prestador",
      "nome_fantasia": "Prestador Fictício",
      "telefone": "5430002222",
      "email": null,
      "endereco": {
        "logradouro": "AV CENTRAL",
        "numero": "66",
        "complemento": null,
        "bairro": "CENTRO",
        "codigo_municipio": "4305108",
        "nome_municipio": "CAXIAS DO SUL",
        "uf": "RS",
        "codigo_pais": "1058",
        "cep": "95000000"
      }
    },
    "tomador": {
      "cpf": null,
      "cnpj": "07504505000132",
      "inscricao_municipal": null,
      "razao_social": "ACRAS TECNOLOGIA DA INFORMACAO LTDA",
      "telefone": "5433330000",
      "email": "test@example.com",
      "endereco": {
        "logradouro": "Rua Fictícia",
        "numero": "2",
        "complemento": "Ap1",
        "bairro": "Centro",
        "codigo_municipio": "4305108",
        "nome_municipio": "CAXIAS DO SUL",
        "uf": "RS",
        "codigo_pais": "1058",
        "cep": "95110000"
      }
    },
    "servicos": [
      {
        "valor_servicos": "100.00",
        "valor_deducoes": "0.00",
        "valor_pis": "0.00",
        "valor_cofins": "0.00",
        "valor_inss": "0.00",
        "valor_ir": "0.00",
        "valor_csll": "0.00",
        "iss_retido": false,
        "valor_iss": "4.00",
        "valor_iss_retido": "0.00",
        "outras_retencoes": null,
        "base_calculo": "100.00",
        "aliquota": "4.0000",
        "valor_liquido": "100.00",
        "valor_credito": null,
        "desconto_incondicionado": "0.00",
        "desconto_condicionado": null,
        "item_lista_servico": "16.02",
        "codigo_cnae": null,
        "codigo_tributario_municipio": "8394",
        "discriminacao": "PREST DE SERV DE TRANSPORTE",
        "codigo_municipio": "4305108",
        "codigo_pais": null,
        "codigo_municipio_incidencia": null,
        "quantidade": "1.00",
        "valor_unitario": "100.00"
      }
    ],
    "url": "https://nfse.caxias.rs.gov.br/consulta/pdf?chaveAcesso=DMMY000",
    "url_xml": "https://focusnfe.s3.sa-east-1.amazonaws.com/arquivos/07504505000132/202302/NFSeRecebidas/NFSe859042900001504305108-5555-123456-DMMY000.xml"
  }
]

Caso utilize o argumento completa=1, os dados serão devolvidos em formato estendido, similar ao de emissão de NFSe com algumas melhorias. Para mais detalhes consulte a Documentação Completa de Campos NFSes Recebidas. Informações adicionais na seção Versões da API.

Consulta de NFSe Individual

Para obter informações completas referentes a uma NFSe específica, consulte informando a chave:

https://api.focusnfe.com.br/v2/nfses_recebidas/CHAVE

Utilize o método HTTP GET para consultar os dados da nota fiscal. Isto irá devolver os mesmos campos da nota completa, conforme descritos na seção anterior.

Versões da API

Exemplo de consulta de NFSe a ser devolvida no formato da versão beta da API:

curl -u "token obtido no cadastro da empresa:" \
  "https://homologacao.focusnfe.com.br/v2/nfses_recebidas/CHAVE?api_version=2020-11-17"

Eventualmente são integradas melhorias nos dados retornados pela API de NFSes Recebidas. Para garantir compatibilidade e facilitar transições, é possível consultar dados de versões específicas da API informando o parâmetro api_version (recomendado).

api_version Padrão¹ Descrição Links Release EOL
2020-11-17 Versão preliminar (beta) documentação legada 01/12/2020 01/10/2024
2023-03-01 x Primeira versão estável documentação, changelog 02/10/2023 -

(¹) Última versão estável da API de NFSes Recebidas, assumida como padrão quando não informado o parâmetro.

CTe e CTe OS

Através da API CTe é possível:

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/cte/REFERENCIA Consulta a CTe com a referência informada e o seu status de processamento
DELETE /v2/cte/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:

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:

Caso na requisição seja passado o parâmetro completo=1 será adicionado mais 6 campos:

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:

A API irá em seguida devolver os seguintes campos:

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:

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:

A API irá em seguida devolver os seguintes campos:

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:

A API irá enviar uma resposta com os seguintes campos:

NFCom (beta)

Através da API NFCom é possível:

Todos os processos envolvendo NFCom 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/nfcom?ref=REFERENCIA Emite uma NFCom.
GET /v2/nfcom/REFERENCIA Consulta a NFCom com a referência informada e seu status de processamento.
DELETE /v2/nfcom/REFERENCIA Cancela a NFCom com a referência informada.

Campos da NFCom

A NFCom 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 NFCom. Nela, você pode buscar os campos pela TAG XML ou pela nossa tradução para API.

Documentação completa dos campos NFCom

Status API

Aqui você encontra os status possíveis para NFCom.

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 nao_autorizado NFCom não autorizada. O cancelamento só é possível para NFCom'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 NFCom 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 NFCom 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 NFCom 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 NFCom ou foi informado o CNPJ do emitente incorretamente no JSON.

Envio

# arquivo.json deve conter os dados da NFCom
curl -u "token obtido no cadastro da empresa:" \
  -X POST -T nfcom.json https://homologacao.focusnfe.com.br/v2/nfcom?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 NFComAutorizar {

  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 utilize a variável abaixo:
    String server = "https://api.focusnfe.com.br/"; */
    String server = "https://homologacao.focusnfe.com.br/";

    String url = server.concat("v2/nfcom?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> nfcom = new HashMap<String, String>();
    HashMap<String, String> itens = new HashMap<String, String>();

    nfcom.put("data_emissao", "2023-05-04T16:57:42-03:00");
    nfcom.put("numero_site", "0");
    nfcom.put("tipo_faturamento", "0");
    nfcom.put("finalidade_nfcom", "0");
    nfcom.put("cnpj_emitente", "51916585000125");
    nfcom.put("ie_virtual_emitente", "123");
    nfcom.put("nome_emitente", "ACME LTDA");
    nfcom.put("nome_fantasia_emitente", "ACME TESTES");
    nfcom.put("logradouro_emitente", "R. Padre Natal Pigato");
    nfcom.put("numero_emitente", "100");
    nfcom.put("bairro_emitente", "Santa Felicidade");
    nfcom.put("municipio_emitente", "Curitiba");
    nfcom.put("uf_emitente", "PR");
    nfcom.put("cep_emitente", "82320030");
    nfcom.put("inscricao_estadual_emitente", "101942171617");
    nfcom.put("nome_destinatario", "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL");
    nfcom.put("cnpj_destinatario", "85904290000150");
    nfcom.put("indicador_ie_destinatario", "2");
    nfcom.put("logradouro_destinatario", "Rua Fictícia");
    nfcom.put("numero_destinatario", "2");
    nfcom.put("bairro_destinatario", "Centro");
    nfcom.put("municipio_destinatario", "Curitiba");
    nfcom.put("uf_destinatario", "PR");
    nfcom.put("cep_destinatario", "82320030");
    nfcom.put("codigo_assinante", "1");
    nfcom.put("tipo_assinante", "3");
    nfcom.put("tipo_servico", "5");
    itens.put("numero_item","1");
    itens.put("codigo_produto","123");
    itens.put("descricao","Teste NFCom");
    itens.put("classificacao","0100401");
    itens.put("unidade_medida","4");
    itens.put("quantidade_fatura","1");
    itens.put("valor_item","139.90");
    itens.put("valor_produtos","139.90");

    /* Depois de fazer o input dos dados, são criados os objetos JSON já com os valores das hash's. */
    JSONObject json = new JSONObject (nfcom);
    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 utilizado 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/nfcom?ref=" + ref

# altere os campos conforme a nota que será enviada
dados_da_nota = {
  data_emissao: "2023-05-04T16:57:42-03:00",
  numero_site: "0",
  tipo_faturamento: "0",
  finalidade_nfcom: "0",
  cnpj_emitente: "51916585000125",
  ie_virtual_emitente: "123",
  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",
  cnpj_destinatario: "85904290000150",
  indicador_ie_destinatario: "2",
  logradouro_destinatario: "Rua Fictícia",
  numero_destinatario: "2",
  bairro_destinatario: "Centro",
  municipio_destinatario: "Curitiba",
  cep_destinatario: "82320030",
  uf_destinatario: "PR",
  codigo_assinante: "1",
  tipo_assinante: "3",
  tipo_servico: "5",
  itens: [
    {
      numero_item: "1",
      codigo_produto: "123",
      descricao: "Teste NFCom",
      classificacao: "0100401",
      unidade_medida: "4",
      quantidade_fatura: "1",
      valor_item: "139.90",
      valor_produtos: "139.90"
    }
  ]
}

# 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)

# adicionamos 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 extraídas 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 produção utilize a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfcom?ref=" + ref;

/*
Utilize o valor 'false' como terceiro parâmetro para que a requisição aguarde a resposta da API.
Passamos o token como quarto parâmetro deste método como autenticador do HTTP Basic Authentication.
*/
request.open('POST', url, false, token);

var nfcom = {
  "data_emissao": "2023-05-04T16:57:42-03:00",
  "numero_site": "0",
  "tipo_faturamento": "0",
  "finalidade_nfcom": "0",
  "cnpj_emitente": "51916585000125",
  "ie_virtual_emitente": "123",
  "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",
  "cnpj_destinatario": "85904290000150",
  "indicador_ie_destinatario": "2",
  "logradouro_destinatario": "Rua Fictícia",
  "numero_destinatario": "2",
  "bairro_destinatario": "Centro",
  "municipio_destinatario": "Curitiba",
  "cep_destinatario": "82320030",
  "uf_destinatario": "PR",
  "codigo_assinante": "1",
  "tipo_assinante": "3",
  "tipo_servico": "5",
  "itens": [
    {
      "numero_item": "1",
      "codigo_produto": "123",
      "descricao": "Teste NFCom",
      "classificacao": "0100401",
      "unidade_medida": "4",
      "quantidade_fatura": "1",
      "valor_item": "139.90",
      "valor_produtos": "139.90"
    }
  ]
};

// Aqui fazemos a serialização do JSON com os dados da nota e enviamos através do método utilizado.
request.send(JSON.stringify(nfcom));

// Sua aplicação terá que tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);

<?php
/* Você deverá definir isso globalmente para a sua aplicação.
Para ambiente de produção utilize 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 da nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$nfcom = array (
  "data_emissao" => "2023-05-04T16:57:42-03:00",
  "numero_site" => "0",
  "tipo_faturamento" => "0",
  "finalidade_nfcom" => "0",
  "cnpj_emitente" => "51916585000125",
  "ie_virtual_emitente" => "123",
  "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",
  "cnpj_destinatario" => "85904290000150",
  "indicador_ie_destinatario" => "2",
  "logradouro_destinatario" => "Rua Fictícia",
  "numero_destinatario" => "2",
  "bairro_destinatario" => "Centro",
  "municipio_destinatario" => "Curitiba",
  "cep_destinatario" => "82320030",
  "uf_destinatario" => "PR",
  "codigo_assinante" => "1",
  "tipo_assinante" => "3",
  "tipo_servico" => "5",
  "itens" => array(
    array(
      "numero_item" => "1",
      "codigo_produto" => "123",
      "descricao" => "Teste NFCom",
      "classificacao" => "0100401",
      "unidade_medida" => "4",
      "quantidade_fatura" => "1",
      "valor_item" => "139.90",
      "valor_produtos" => "139.90"
    )
  ),
);
// Inicie o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfcom?ref=" . $ref);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($nfcom));
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);
?>
# Faça o download e a instalação da biblioteca requests, através do python-pip.
import json
import requests

# Para ambiente de produção utilize a variável abaixo:
# url = "https://api.focusnfe.com.br"
url = "https://homologacao.focusnfe.com.br/v2/nfcom"

# Substituir pela sua identificação interna da nota
ref = {"ref":"12345"}

token="token obtido no cadastro da empresa"

# Utilizamos dicionários para armazenar os campos e valores que
# serão convertidos em JSON e enviados para nossa API.

nfcom = {}
itens = {}

nfcom["data_emissao"] = "2023-05-04T16:57:42-03:00"
nfcom["numero_site"] = "0"
nfcom["tipo_faturamento"] = "0"
nfcom["finalidade_nfcom"] = "0"
nfcom["cnpj_emitente"] = "51916585000125"
nfcom["ie_virtual_emitente"] = "123"
nfcom["nome_emitente"] = "ACME LTDA"
nfcom["nome_fantasia_emitente"] = "ACME TESTES"
nfcom["logradouro_emitente"] = "R. Padre Natal Pigato"
nfcom["numero_emitente"] = "100"
nfcom["bairro_emitente"] = "Santa Felicidade"
nfcom["municipio_emitente"] = "Curitiba"
nfcom["uf_emitente"] = "PR"
nfcom["cep_emitente"] = "82320030"
nfcom["inscricao_estadual_emitente"] = "101942171617"
nfcom["nome_destinatario"] = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"
nfcom["cnpj_destinatario"] = "85904290000150"
nfcom["indicador_ie_destinatario"] = "2"
nfcom["logradouro_destinatario"] = "Rua Fictícia"
nfcom["numero_destinatario"] = "2"
nfcom["bairro_destinatario"] = "Centro"
nfcom["municipio_destinatario"] = "Curitiba"
nfcom["uf_destinatario"] = "PR"
nfcom["cep_destinatario"] = "82320030"
nfcom["codigo_assinante"] = "1"
nfcom["tipo_assinante"] = "3"
nfcom["tipo_servico"] = "5"
itens["numero_item"] = "1"
itens["codigo_produto"] = "123"
itens["descricao"] = "Teste NFCom"
itens["classificacao"] = "0100401"
itens["unidade_medida"] = "4"
itens["quantidade_fatura"] = "1"
itens["valor_item"] = "139.90"
itens["valor_produtos"] = "139.90"

# Adicionamos os dados da variável itens como listas ao dicionário principal.
nfcom["items"] = [itens]

r = requests.post(url, params=ref, data=json.dumps(nfcom), auth=(token,""))

# Imprimimos na tela o codigo HTTP da requisição e a mensagem de retorno da API
print(r.status_code, r.text)

Para enviar uma NFCom utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de testes.

Envia uma NFCom para autorização:

https://api.focusnfe.com.br/v2/nfcom?ref=REFERENCIA

Utilize o comando HTTP POST para enviar a nota para a API. Envie no corpo do POST os dados da nota fiscal em formato JSON.

A numeração da nota (número e série), pode ser definida automaticamente pela API. É recomendado deixar a 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 da NFCom é 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.

Consulta

curl -u "token obtido no cadastro da empresa:" \
  https://homologacao.focusnfe.com.br/v2/nfcom/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 NFComConsulta {

  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 utilize a variável abaixo:
    String server = "https://api.focusnfe.com.br/"; */
    String server = "https://homologacao.focusnfe.com.br/";

    String url = server.concat("v2/nfcom/"+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 utilizado 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/nfcom/" + 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)

# adicionamos 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)

# imprimimos o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code

# imprimimos o corpo da resposta
puts "Corpo da resposta: " + resposta.body

/*
As orientacoes a seguir foram extraídas 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 produção utilize a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfcom/" + ref + "?completa=1";

/*
Utilize o valor 'false' como terceiro parâmetro para que a requisição aguarde a resposta da API.
Passamos o token como quarto parâmetro deste método como autenticador do HTTP Basic Authentication.
*/
request.open('GET', url, false, token);

request.send();

// Sua aplicação terá que tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);

<?php
/* Você deverá definir isso globalmente para sua aplicação.
Para ambiente de produção utilize 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 da nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
// Inicie o processo de envio das informações usando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server."/v2/nfcom/" . $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);
?>
# Faça o download e a instalação da biblioteca requests, através do python-pip.
import requests

# Para ambiente de produção utilize a variável abaixo:
# url = "https://api.focusnfe.com.br"
url = "https://homologacao.focusnfe.com.br/v2/nfcom/"

# Substituir pela sua identificação interna da nota
ref = "12345"

token="token obtido no cadastro da empresa"

# Utilize este parâmetro para obter mais informações em suas consultas
completa = "completa=1"

r = requests.get(url+ref, params=completa, auth=(token,""))

# Imprimimos na tela o codigo HTTP da requisição e a mensagem de retorno da API
print(r.status_code, r.text)

Para consultar uma NFCom utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de testes.

Consultar as informações de uma NFCom:

https://api.focusnfe.com.br/v2/nfcom/REFERENCIA?completa=(0|1)

Utilize o comando HTTP GET para consultar a nota através da API.

Parâmetro Opcional Ação
completa = 0 ou 1 Habilita a API para mostrar campos adicionais na requisição de consulta.

Campos de retorno:

Caso na requisição seja passado o parâmetro completa=1 serão adicionados 4 campos:

Cancelamento

curl -u "token obtido no cadastro da empresa:" \
  -X DELETE -d '{"justificativa":"Informe aqui a sua justificativa para realizar o cancelamento da NFCom."}' \
  https://homologacao.focusnfe.com.br/v2/nfcom/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 NFComCancelamento {

  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 utilize a variável abaixo:
    String server = "https://api.focusnfe.com.br/"; */
    String server = "https://homologacao.focusnfe.com.br/";

    String url = server.concat("v2/nfcom/"+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 NFCom.");

    /* 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 utilizado 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/nfcom/" + ref

# altere os campos conforme a nota que será enviada
justificativa_cancelamento = {
  justificativa: "Informe aqui a sua justificativa para realizar o cancelamento da NFCom."
}

# 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)

# adicionamos 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)

# imprimimos o código HTTP da resposta
puts "Código retornado pela requisição: " + resposta.code

# imprimimos o corpo da resposta
puts "Corpo da resposta: " + resposta.body

/*
As orientações 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 utilize a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfcom/"+ ref;

/*
Utilize o valor 'false' como terceiro parâmetro para que a requisicao aguarde a resposta da API.
Passamos o token como quarto parâmetro deste método como autenticador do HTTP Basic Authentication.
*/
request.open('DELETE', url, false, token);

var cancelar = {
  "justificativa": "Informe aqui a sua justificativa para realizar o cancelamento da NFCom."
};

// Aqui fazemos a serialização do JSON com os dados da nota e enviamos através do método utilizado.
request.send(JSON.stringify(cancelar));

// Sua aplicação terá que tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);

<?php
/* Você deverá definir isso globalmente para sua aplicação.
Para ambiente de produção utilize 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 da nota.
$ref = "12345";
$login = "token obtido no cadastro da empresa";
$password = "";
$justificativa = array ("justificativa" => "Informe aqui a sua justificativa para realizar o cancelamento da NFCom.");
// Inicie o processo de envio das informações utilizando o cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server . "/v2/nfcom/" . $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);
?>
# Faça o download e a instalação da biblioteca requests, através do python-pip.
import json
import requests

# Para ambiente de produção utilize a variável abaixo:
# url = "https://api.focusnfe.com.br"
url = "https://homologacao.focusnfe.com.br/v2/nfcom/"

# Substituir pela sua identificação interna da nota
ref = "12345"

token="token obtido no cadastro da empresa"

# Usamos um dicionário para armazenar os campos e valores que
# serão convertidos para JSON e enviados para nossa API
justificativa={}
justificativa["justificativa"] = "Informe aqui a sua justificativa para realizar o cancelamento da NFCom."

r = requests.delete(url+ref, data=json.dumps(justificativa), auth=(token,""))

# Imprimimos na tela o código HTTP da requisição e a mensagem de retorno da API
print(r.status_code, r.text)

Para cancelar uma NFCom, basta fazer uma requisição à URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de testes.

Cancelar uma NFCom já autorizada:

https://api.focusnfe.com.br/v2/nfcom/REFERENCIA

Utilize o comando HTTP DELETE para cancelar a nota através da API.

O parâmetro de cancelamento deverá ser enviado da seguinte forma:

A API devolverá os seguintes campos:

Prazo de cancelamento

A NFCom poderá ser cancelada em até 24 horas após a emissão. No entanto, alguns estados podem permitir um prazo maior para o cancelamento.

MDFe

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:

Através da API MDF-e é possível:

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/inclusao_dfe Inclui um novo DFe.
POST /v2/mdfe/REFERENCIA/encerrar 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:

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.

Envio

# arquivo.json deve conter os dados da MDF-e
curl -u "token obtido no cadastro da empresa:" \
  -X POST -T arquivo.json https://homologacao.focusnfe.com.br/v2/mdfe?ref=12345

Para enviar uma MDF-e utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.

Envia uma MDF-e para autorização:

https://api.focusnfe.com.br/v2/mdfe?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 MDF-e.

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.

Emissão em contingência offline

Para enviar uma MDF-e em contingência offline utilize a URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.

https://api.focusnfe.com.br/v2/mdfe?ref=REFERENCIA&contingencia=1

É importante ressaltar que atualmente não há a possibilidade de envio de MDF-e em contingência offline de forma automática, apenas de forma manual, utilizando o parâmetro contingencia=1.

Consulta

curl -u "token obtido no cadastro da empresa:" \
  https://homologacao.focusnfe.com.br/v2/mdfe/12345

Para consultar uma MDF-e 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 MDF-e:

https://api.focusnfe.com.br/v2/mdfe/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:

Caso na requisição seja passado o parâmetro completa=1 será adicionado mais 6 campos:

Exemplo de resposta da consulta de MDF-e:

{
    "cnpj_emitente": "11111151000119",
    "ref": "ref123",
    "status": "autorizado",
    "status_sefaz": "100",
    "mensagem_sefaz": "Autorizado o uso do MDF-e",
    "chave": "MDFe21111114611151000119570010000000111973476363",
    "numero": "11",
    "serie": "1",
    "modelo": "58",
    "caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/11111151000119/201805/XMLs/311110000007009_v03.00-protMDF-e.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": "MDF-e21111114611151000119570010000000111973476363",
  "numero": "11",
  "serie": "1",
  "modelo": "57",
  "caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/11111151000119/201805/XMLs/311110000007009_v03.00-protMDF-e.xml",
  "caminho_xml_carta_correcao": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/11111151000119/201805/XMLs/311110000007012_v03.00-eventoMDF-e.xml"
  "requisicao": {
    /* campos da MDF-e aqui omitida */
  }
  "protocolo": {
    "versao": "3.00",
    "id_tag": "MDFe329180000007009",
    "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 MDF-e"
  },
}

Cancelamento

curl -u "token obtido no cadastro da empresa:" \
  -X DELETE -d '{"justificativa":"Teste de cancelamento"}' \
  https://homologacao.focusnfe.com.br/v2/mdfe/12345

Resposta da API para a requisição de cancelamento:

{
  "status_sefaz": "135",
  "mensagem_sefaz": "Evento registrado e vinculado a MDF-e",
  "status": "cancelado",
  "caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/14674451000119/201805/XMLs/329180000006929_v03.00-eventoMDF-e.xml"
}

Para cancelar uma MDF-e, basta fazer uma requisição à URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.

Cancelar uma MDF-e já autorizada:

https://api.focusnfe.com.br/v2/mdfe/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âmetros de cancelamento deverão ser enviados da seguinte forma:

A API irá em seguida devolver os seguintes campos:

Prazo de cancelamento

A MDF-e poderá ser cancelada em até 24 horas após a emissão.

Inclusão de Condutor

curl -u "token obtido no cadastro da empresa:" \
  -X POST -d '{"nome":"João da Silva","cpf":"68971569140"}' \
  https://homologacao.focusnfe.com.br/v2/mdfe/12345/inclusao_condutor

Resposta da API para a requisição de cancelamento:

{
  "status_sefaz": "135",
  "mensagem_sefaz": "Evento registrado e vinculado a MDF-e",
  "status": "incluido",
  "caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/14674451000119/201805/XMLs/329180000006929_v03.00-eventoMDF-e.xml"
}

Para incluir um condutor adicional em uma MDF-e autorizada, basta fazer uma requisição à URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.

Incluir um condutor em uma MDF-e autorizada:

https://api.focusnfe.com.br/v2/mdfe/REFERENCIA/inclusao_condutor

Utilize o comando HTTP POST para incluir um condutor. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.

Os parâmetros de inclusão deverão ser enviados da seguinte forma:

A API irá em seguida devolver os seguintes campos:

Inclusão de DFe

curl -u "token obtido no cadastro da empresa:" \
  -X POST -d '{
    "protocolo": "110011000001101",
    "codigo_municipio_carregamento": "5107875",
    "documentos": [
        {
            "codigo_municipio_descarregamento": "5107875",
            "chave_nfe": "51210810425282002508550010000186761100123456"
        }
    ]
  }' \
  https://homologacao.focusnfe.com.br/v2/mdfe/12345/inclusao_dfe

Resposta da API para a requisição de cancelamento:

{
  "status_sefaz": "135",
  "mensagem_sefaz": "Evento registrado e vinculado a MDF-e",
  "status": "incluido",
  "caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/14674451000119/201805/XMLs/329180000006929_v03.00-eventoMDF-e.xml"
}

Para incluir um DFe adicional em uma MDF-e autorizada (com indicativo de carregamento posterior), basta fazer uma requisição à URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.

Incluir um DFe em uma MDF-e autorizada:

https://api.focusnfe.com.br/v2/mdfe/REFERENCIA/inclusao_dfe

Utilize o comando HTTP POST para incluir um DFe. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.

Os parâmetros de inclusão deverão ser enviados da seguinte forma:

A API irá em seguida devolver os seguintes campos:

Encerramento

curl -u "token obtido no cadastro da empresa:" \
  -X POST -d '{"data":"2019-03-05","sigla_uf":"SP","nome_municipio":"São Paulo"}' \
  https://homologacao.focusnfe.com.br/v2/mdfe/12345/encerrar

Resposta da API para a requisição de encerramento:

{
  "status_sefaz": "135",
  "mensagem_sefaz": "Evento registrado e vinculado a MDF-e",
  "status": "encerrado",
  "caminho_xml": "https://focusnfe.s3-sa-east-1.amazonaws.com/arquivos_development/14674451000119/201805/XMLs/329180000006929_v03.00-eventoMDF-e.xml"
}

Após o término da operação, o MDFe terá que ser obrigatoriamente encerrado. Para isso basta fazer uma requisição à URL abaixo, alterando o ambiente de produção para homologação, caso esteja emitindo notas de teste.

Encerrar uma MDF-e autorizada:

https://api.focusnfe.com.br/v2/mdfe/REFERENCIA/encerrar

Utilize o comando HTTP POST para incluir um condutor. Este método é síncrono, ou seja, a comunicação com a SEFAZ será feita imediatamente e devolvida a resposta na mesma requisição.

Os parâmetros de encerramento deverão ser enviados da seguinte forma:

A API irá em seguida devolver os seguintes campos:

Manifestação - NFe

A API para manifestação do sistema Focus permite que você consulte todas as notas recebidas pela sua empresa (modelo 55) e permite que você realize a manifestação frente a receita, informando se a operação descrita na nota foi realizada ou não. A API faz ainda a guarda de todos os documentos recebidos para que você consulte quando precisar.

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@focusnfe.com.br.

URLs

Método URL (recurso) Ação
POST /v2/nfes_recebidas/CHAVE/manifesto Realiza um manifesto na nota informada.
GET /v2/nfes_recebidas?cnpj=CNPJ Busca informações resumidas de todas as NFe’s recebidas.
GET /v2/nfes_recebidas/CHAVE/manifesto Consulta o último manifesto válido na nota fiscal informada.
GET /v2/nfes_recebidas/CHAVE.json Consulta as informações da nota fiscal em formato JSON.
GET /v2/nfes_recebidas/CHAVE.xml Consulta as informações da nota fiscal em formato XML.
GET /v2/nfes_recebidas/CHAVE/cancelamento.xml Se existir, baixa o XML de cancelamento da nota fiscal informada.
GET /v2/nfes_recebidas/CHAVE/carta_correcao.xml Se existir, baixa o XML da última carta de correção da nota fiscal informada.

Status API

Aqui você encontra os status possíveis para MDe.

HTTP CODE/STATUS Status API Focus Descrição Correção
400 - bad request manifestacao_nao_aplicavel Esta Nota Fiscal não pode ser manifestada. Procure a nossa equipe de suporte para mais detalhes.
400 - bad request manifestacao_ja_vinculada Este tipo de manifestação já foi vinculado à Nota Fiscal. Consulte as manifestações registradas na NFe antes de realizar uma nova tentativa.
400 - bad request requisicao_invalida Tipo de manifestação não informado O tipo de manifestação não foi informado ou é inválido. Consulte a nossa documentação.
400 - bad request requisicao_invalida A justificativa deve conter pelo menos 15 caracteres Sua justificativa possui menos caracteres que o mínimo. Consulte a nossa documentação.
400 - bad request requisicao_invalida Para manifestação de operação não realizada é obrigatório informar o parâmetro 'justificativa'. Consulte a nossa documentaçã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 MDe. 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 MDe. Verifique se o CNPJ foi informado no JSON de envio.
404 - not found nao_encontrado Nota Fiscal ou Manifesto não encontrado Verifique se a nota fiscal está autorizada e/ou se o manifesto foi registrado na nota fiscal.
403 - forbidden permissao_negada CNPJ do emitente não autorizado. O emitente utilizado não está autorizado a emitir MDe ou foi informado o CNPJ do emitente incorretamente no JSON.

Manifestaçã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/nfes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
manifesto = {}
manifesto["tipo"] = "ciencia"

r = requests.post(url+chave+"/manifesto", data=json.dumps(manifesto), auth=(token,""))

# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)



# substitua CHAVE pela chave da nota
curl -u "token obtido no cadastro da empresa:" \
  -X POST -d '{"tipo":"confirmacao"}' \
  https://homologacao.focusnfe.com.br/v2/nfes_recebidas/CHAVE/manifesto
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 Manifestar {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/nfes_recebidas/"+chave+"/manifesto");

    /* Aqui criamos um hashmap para receber a chave "tipo" e o valor que pode ser: ciencia, confirmacao, desconhecimento ou nao_realizada. */
    HashMap<String, String> tipoManifestacao = new HashMap<String, String>();
    tipoManifestacao.put("tipo", "nao_realizada");

    /* Caso escolha o tipo "nao_realizada", é preciso informar o campo/chave "justificativa".
     * TipoManifestacao.put("justificativa", "Informe aqui a sua justificativa do motivo da não realização da operação."); */

    /* Criamos um objeto JSON para receber a hash com os dados esperado pela API. */
    JSONObject json = new JSONObject(TipoManifestacao);

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/nfes_recebidas/" + chave + "/manifesto"

# altere os campos conforme a nota que será enviada
tipo_manifestacao = {
  tipo: "nao_realizada",
}

# caso escolha o tipo "nao_realizada", é preciso informar o campo/chave "justificativa"
# justificativa: "Informe aqui a sua justificativa do motivo da não realização da operação."

# 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 = tipo_manifestacao.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
// Solicite o seu token para realizar as requisições com nossa equipe de suporte.
 $login = "Token_obtido_no_cadastro_da_empresa";
 $chave = "Chave_de_identificação_da_NFe";
/* Aqui enviamos o tipo de manifestação que desejamos realizar.
   Consulte nossa documentação, para conhecer os demais tipos possíveis: https://goo.gl/a9o7hm */
 $tipo = array("tipo" => "confirmacao");
// 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/nfes_recebidas/".$chave."/manifesto");
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($tipo));

/* 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);
?>

/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfes_recebidas/" + chave + "/manifesto";

/*
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 manifesto = {

  "tipo": "ciencia"
};

// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(manifesto));

// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);

Outro exemplo de dados enviados

{
  "tipo":"nao_realizada",
  "justificativa":"Fornecedor cancelou a operação devido a falta dos produtos em estoque"
}

Você pode realizar as seguintes operações de manifestação em uma NFe recebida:

Para realizar a manifestação, utilize a URL:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE/manifesto

Utilize o método HTTP POST para enviar os parâmetros à API.

Na URL, informe em CHAVE a chave da nota fiscal recebida. No corpo da requisição, informe objeto JSON com os seguintes parâmetros:

Exemplo de dados de resposta:

{
  "status_sefaz": "135",
  "mensagem_sefaz": "Evento registrado e vinculado a NF-e",
  "status": "evento_registrado",
  "protocolo": "891170005150285",
  "tipo": "nao_realizada",
  "justificativa": "Fornecedor cancelou a operação devido a falta dos produtos em estoque"
}

Dados devolvidos

A API irá devolver um objeto JSON com os seguintes parâmetros:

É possível realizar mais de uma manifestação na nota fiscal, ficando válida apenas a última manifestação realizada com sucesso, não sendo possível repetir o tipo de manifestação já realizado. Caso queria consultar a última manifestação válida, utilize o seguinte endereço:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE/manifesto

Utilize o método HTTP GET para consultar os dados da nota fiscal.

Na URL, informe em CHAVE a chave da nota fiscal recebida. O retorno será o mesmo que a operação de manifestação.

Exemplo de como consultar a última manifestação de uma Nota Fiscal Eletrônica.

# 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/nfes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+"/manifesto", auth=(token,""))

# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)

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 ConsultarUltimaManifestacao {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/nfes_recebidas/"+chave+"/manifesto");

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/nfes_recebidas/" + chave + "/manifesto"

# 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
// Solicite o seu token para realizar as requisições com nossa equipe de suporte.
 $login = "Token_obtido_no_cadastro_da_empresa";
 $chave = "Chave_de_identificação_da_NFe";
// 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/nfes_recebidas/".$chave."/manifesto");
 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);
?>

Consulta de NFe Recebidas

Uma nota fiscal recebida pode ter suas informações atualizadas ao longo do tempo. Quando a receita informa que uma nota fiscal foi emitida contra a empresa, recebemos apenas o “cabeçalho” da nota fiscal com os dados mais importantes. Se for manifestada ciência da operação, poderemos receber os demais dados. Da mesma forma, a receita poderá notificar quando a nota recebe uma carta de correção ou quando ela é cancelada.

Por isso as notas fiscais recebidas possuem um campo chamado “versao” que é único entre todos os documentos do mesmo CNPJ e que é atualizado a cada alteração nesta nota fiscal. 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 nota fiscal, com versao = 60, e ela posteriormente receber uma carta de correção ou for cancelada, sua versão será atualizada para algum número maior que 60.

A API busca as últimas atualizações da SEFAZ a cada duas horas.

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/nfes_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/nfes_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/nfes_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/nfes_recebidas?cnpj=" + cnpj

# 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
// 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/nfes_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/nfes_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/nfes_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:

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:

[
  {
    "nome_emitente": "Empresa emitente Ltda.",
    "documento_emitente": "79160190000193",
    "chave_nfe": "41171179060190000182550010000002661875685069",
    "valor_total": "24560.00",
    "data_emissao": "2017-11-07T01:00:00-02:00",
    "situacao": "autorizada",
    "manifestacao_destinatario": "ciencia",
    "nfe_completa": true,
    "tipo_nfe": "1",
    "versao": 73,
    "digest_value": "/C5IuK5fCNVQV2rbwV0d8W12zsk=",
    "numero_carta_correcao": "1",
    "carta_correcao": "Algum texto da carta de correção.",
    "data_carta_correcao": "2017-11-07T14:31:48-02:00",
    "data_cancelamento": "2017-11-07T14:45:14-02:00",
    "justificativa_cancelamento": "Nota cancelada por algum motivo"
  }
]

Dados devolvidos

A API irá devolver os seguintes cabeçalhos HTTP:

Os dados devolvidos no corpo da requisição serão um array de objetos em JSON no seguinte formato:

Consulta de NFe individuais

Disponibilizamos diversos métodos para obter mais informações de uma nota fiscal recebida conforme mostramos a seguir:

Pesquisa de uma nota fiscal por chave

Para pesquisar as informações específicas de uma NFe, consulte:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE

Utilize o método HTTP GET para consultar os dados da nota fiscal.

Isto irá devolver os mesmos campos descritos no item 2.2. Quando você tiver muitas empresas cadastradas, pode desambiguar o documento informando o parâmetro cnpj=CNPJ, da seguinte forma:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE?cnpj=CNPJ

Isto irá devolver os mesmos campos descritos no item 2.2. Você pode solicitar também os dados completos da nota informando o parâmetro completa=1, da seguinte forma:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE?completa=1

Utilize o método HTTP GET para consultar os dados da nota fiscal.

Isto irá adicionar 6 novos campos:

Download de DANFe e XML

Exemplo de como realizar o download do XML de uma Nota Fiscal Eletrônica especifica.

/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfes_recebidas/" + chave + ".xml";

/*
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);

# 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/nfes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+".xml", 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/nfes_recebidas/CHAVE.xml
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 DownloadNotaEspecificaXml {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/nfes_recebidas/"+chave+".xml");

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/nfes_recebidas/" + chave + ".xml"

# 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
// Solicite o seu token para realizar as requisições com nossa equipe de suporte.
 $login = "Token_obtido_no_cadastro_da_empresa";
 $chave = "Chave_de_identificação_da_NFe";
// 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/nfes_recebidas/".$chave.".xml");
 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);
// Converte os dados de XML para objeto, mostrando o retorno bruto.
 var_dump(simplexml_load_string($body));
 curl_close($ch);
?>

Exemplo de como fazer o download, no formato JSON, do XML de uma Nota Fiscal Eletrônica especifica.


/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfes_recebidas/" + chave + ".json?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);

# 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/nfes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+".json?completa=1", 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/nfes_recebidas/CHAVE.json?completa=1"
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 DownloadNotaEspecifica {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/nfes_recebidas/"+chave+".json?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"

chave = "chave_de_identificacao_da_NFe"

# 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/nfes_recebidas/" + chave + ".json?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

<?php
// Solicite o seu token para realizar as requisições com nossa equipe de suporte.
 $login = "Token_obtido_no_cadastro_da_empresa";
 $chave = "Chave_de_identificação_da_NFe";
// 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/nfes_recebidas/".$chave.".json?completa=1");
 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);
?>

Exemplo de como fazer o download do XML de cancelamento de uma Nota Fiscal Eletrônica.


/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfes_recebidas/" + chave + "/cancelamento.xml";

/*
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);

# 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/nfes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+"/cancelamento.xml", 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/nfes_recebidas/CHAVE/cancelamento.xml
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 DownloadCancelamentoXml {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/nfes_recebidas/"+chave+"/cancelamento.xml");

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/nfes_recebidas/" + chave + "/cancelamento.xml"

# 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
// Solicite o seu token para realizar as requisições com nossa equipe de suporte.
 $login = "Token_obtido_no_cadastro_da_empresa";
 $chave = "Chave_de_identificação_da_NFe";
// 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/nfes_recebidas/".$chave."/cancelamento.xml");
 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);
// Converte os dados de XML para objeto, mostrando o retorno bruto.
 var_dump(simplexml_load_string($body));
 curl_close($ch);
?>

Exemplo de como realizar o download do XML de uma Nota Fiscal Eletrônica especifica com Carta de Correção Eletrônica.


/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/nfes_recebidas/" + chave + "carta_correcao.xml";

/*
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);

# 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/nfes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+"/carta_correcao.xml", 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/nfes_recebidas/CHAVE/carta_correcao.xml
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 DownloadXmlCce {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/nfes_recebidas/"+chave+"/carta_correcao.xml");

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/nfes_recebidas/" + chave + "/carta_correcao.xml"

# 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
// Solicite o seu token para realizar as requisições com nossa equipe de suporte.
 $login = "Token_obtido_no_cadastro_da_empresa";
 $chave = "Chave_de_identificação_da_NFe";
// 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/nfes_recebidas/".$chave."/carta_correcao.xml");
 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);
// Converte os dados de XML para objeto, mostrando o retorno bruto.
 var_dump(simplexml_load_string($body));

   curl_close($ch);
?>

Também é possível fazer o download do XML e DANFe das notas fiscais através da API, basta informar a chave de identificação da respectiva nota no parâmetro CHAVE:

Baixar o XML de uma nota fiscal especifica:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE.xml

Utilize o método HTTP GET para obter os dados das notas no formato XML.

Baixar a DANFe de uma nota fiscal especifica:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE.pdf

Utilize o método HTTP GET para obter os dados das notas no formato PDF. Esta requisição irá redirecionar para o endereço onde é salvo o PDF. Caso a sua biblioteca HTTP não consiga seguir requisições de redirecionamento você pode capturar a URL completa no cabeçalho "Location" devolvido pela API.

Baixar o XML, em formato json, de uma nota fiscal especifica:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE.json?completa=1

Utilize o método HTTP GET para obter os dados das notas no formato XML.

Baixar o XML de cancelamento de uma nota fiscal:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE/cancelamento.xml

Utilize o método HTTP GET para obter os dados das notas no formato XML.

Baixar o XML da última Carta de Correção Eletrônica de uma nota fiscal:

https://api.focusnfe.com.br/v2/nfes_recebidas/CHAVE/carta_correcao.xml

Utilize o método HTTP GET para obter os dados das notas no formato XML.

Manifestação - CTe

Da mesma forma que a manifestação de NFe, a API para manifestação de CTe do sistema Focus permite que você consulte todos os conhecimentos de transporte recebidos pela sua empresa e permite que você realize a manifestação frente a receita. No caso da CTe, é necessário realizar a manifestação apenas se houver algum desacordo com a CTe emitida. A API faz ainda a guarda de todos os documentos recebidos para que você consulte quando precisar e recupera todas as MDFes associadas a CTe.

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@focusnfe.com.br.

URLs

Método URL (recurso) Ação
GET /v2/ctes_recebidas?cnpj=CNPJ Busca os dados resumidos de todas as CTes recebidas.
POST /v2/ctes_recebidas/CHAVE/desacordo Informa um desacordo na CTe recebida
GET /v2/ctes_recebidas/CHAVE/desacordo Consulta o último desacordo válido para o CTe informado
GET /v2/ctes_recebidas/CHAVE.json Consulta a informações da CTe em formato JSON.
GET /v2/ctes_recebidas/CHAVE.xml Consulta as informações da CTe em formato XML.
GET /v2/ctes_recebidas/CHAVE/cancelamento.xml Se existir, baixa o XML de cancelamento da CTe informada.
GET /v2/ctes_recebidas/CHAVE/carta_correcao.xml Se existir, baixa o XML da última carta de correção da CTe informada.

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 Desacordo já registrado para este Documento Fiscal Não é possível informar o desacordo mais de uma vez
400 - bad request requisicao_invalida Parâmetro "observacoes" não informado Ao informar um desacordo é necessário informar o campo "observacoes" informando o motivo do desacordo
400 - bad request requisicao_invalida Parâmetro "observacoes" deve ter entre 15 e 255 caracteres Informe o número de caracteres correto para este campo
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 manifestação. 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 MDe. Verifique se o CNPJ foi informado no JSON de envio.
404 - not found nao_encontrado Documento Fiscal não encontrado Verifique se a chave está correta
403 - forbidden permissao_negada CNPJ do emitente não autorizado. O emitente utilizado não está autorizado a realizar a manifestação ou foi informado o CNPJ do emitente incorretamente no JSON.

Informar desacordo

# 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/ctes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

'''
Usamos um dicionario para armazenar os campos e valores que em seguida,
serao convertidos a JSON e enviados para nossa API
'''
manifesto = {}
manifesto["observacoes"] = "Observações referente ao desacordo informado"

r = requests.post(url+chave+"/desacordo", data=json.dumps(manifesto), auth=(token,""))

# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)



# substitua CHAVE pela chave da nota
curl -u "token obtido no cadastro da empresa:" \
  -X POST -d '{"observacoes":"Observações referente ao desacordo informado"}' \
  https://homologacao.focusnfe.com.br/v2/ctes_recebidas/CHAVE/desacordo
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 Manifestar {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/ctes_recebidas/"+chave+"/desacordo");

    /* Aqui criamos um hashmap para receber a chave "tipo" e o valor que pode ser: ciencia, confirmacao, desconhecimento ou nao_realizada. */
    HashMap<String, String> tipoManifestacao = new HashMap<String, String>();
    tipoManifestacao.put("observacoes", "Observações referente ao desacordo informado");

    /* Criamos um objeto JSON para receber a hash com os dados esperado pela API. */
    JSONObject json = new JSONObject(TipoManifestacao);

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/ctes_recebidas/" + chave + "/desacordo"

# altere os campos conforme a nota que será enviada
tipo_manifestacao = {
  observacoes: "Observações referente ao desacordo informado",
}

# 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 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 = tipo_manifestacao.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
// Solicite o seu token para realizar as requisições com nossa equipe de suporte.
 $login = "Token_obtido_no_cadastro_da_empresa";
 $chave = "Chave_de_identificação_da_NFe";
/* Aqui enviamos o tipo de manifestação que desejamos realizar.
   Consulte nossa documentação, para conhecer os demais tipos possíveis: https://goo.gl/a9o7hm */
 $tipo = array("observacoes" => "Observações referente ao desacordo informado");
// 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/ctes_recebidas/".$chave."/desacordo");
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($tipo));

/* 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);
?>

/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/ctes_recebidas/" + chave + "/desacordo";

/*
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 manifesto = {

  "observacoes": "Observações referente ao desacordo informado"
};

// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(manifesto));

// 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 dados enviados

{
  "observacoes":"Observações referente ao desacordo informado"
}

No momento é possível informar apenas o desacordo da operações de conhecimento de transporte. É obrigatório informar o campo "observacoes" contendo os detalhes que motivaram o desacordo.

Para informar o desacordo, utilize a URL:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE/desacordo

Utilize o método HTTP POST para enviar os parâmetros à API.

Na URL, informe em CHAVE a chave da CTe recebida. No corpo da requisição, informe objeto JSON com os seguintes parâmetros:

Exemplo de dados de resposta:

{
  "status_sefaz": "135",
  "mensagem_sefaz": "Evento registrado e vinculado a CT-e",
  "status": "evento_registrado",
  "protocolo": "891170005150285",
}

Dados devolvidos

A API irá devolver um objeto JSON com os seguintes parâmetros:

Caso queria consultar o desacordo realizado, utilize o seguinte endereço:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE/manifesto

Utilize o método HTTP GET para consultar os dados da nota fiscal.

Na URL, informe em CHAVE a chave da CTe recebida. O retorno será o mesmo que a operação de manifestação.

OBS: Conforme definido pela SEFAZ na NT 2022.001 do CT-e, se o tomador/destinatário for pessoa física (CPF cadastrado em nossa API para a manifestação do CT-e) não pode registrar o evento de desacordo desse tipo de documento via webservice. Essa ação deve ser realizada exclusivamente através da plataforma gov.br conforme procedimento a seguir:

Exemplo de como consultar o desacordo de uma CTe

# 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/ctes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+"/desacordo", auth=(token,""))

# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)

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 ConsultarUltimaManifestacao {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/ctes_recebidas/"+chave+"/desacordo");

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/ctes_recebidas/" + chave + "/desacordo"

# 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";
 $chave = "Chave_de_identificação_da_NFe";
// 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/ctes_recebidas/".$chave."/desacordo");
 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);
?>

Consulta de CTe Recebidas

Uma CTe recebida pode ter suas informações atualizadas ao longo do tempo. Quando a receita informa que uma CTe foi emitida contra a empresa, recebemos o XML completa desta CTe e a receita poderá posteriormente notificar quando a CTe recebe uma carta de correção ou quando ela é cancelada.

As CTes recebidas possuem um campo chamado “versao” que é único entre todos os documentos do mesmo CNPJ e que é atualizado a cada alteração nesta CTe. 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 CTe com versao = 60, e ela posteriormente receber uma carta de correção ou for cancelada, sua versão será atualizada para algum número maior que 60.

A API busca as últimas atualizações da SEFAZ a cada duas horas.

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/ctes_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/ctes_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/ctes_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/ctes_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/ctes_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/ctes_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/ctes_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:

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:

[
  {
    "nome_emitente": "Empresa emitente Ltda.",
    "documento_emitente": "79160190000193",
    "chave":"35191008165642000152570020004201831004201839",
    "valor_total":"295.66",
    "data_emissao":"2019-10-07T23:44:00-03:00",
    "situacao":"autorizado",
    "tipo_cte":"0",
    "versao":1709,
    "digest_value":"Xa/AO4zX/qSMh13ILIh1V7GTAQ3=",
    "cnpj_destinatario":"24178617000110"
  }
]

Dados devolvidos

A API irá devolver os seguintes cabeçalhos HTTP:

Os dados devolvidos no corpo da requisição serão um array de objetos em JSON no seguinte formato:

Consulta de CTe individuais

Disponibilizamos diversos métodos para obter mais informações de um documento recebido conforme mostramos a seguir:

Pesquisa de um documento por chave

Para pesquisar as informações específicas de uma CTe, consulte:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE

Utilize o método HTTP GET para consultar os dados da nota fiscal.

Isto irá devolver os mesmos campos descritos no item 2.2. Quando você tiver muitas empresas cadastradas, pode desambiguar o documento informando o parâmetro cnpj=CNPJ, da seguinte forma:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE?cnpj=CNPJ

Isto irá devolver os mesmos campos descritos no item 2.2. Você pode solicitar também os dados completos do documento informando o parâmetro completa=1, da seguinte forma:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE?completa=1

Utilize o método HTTP GET para consultar os dados da nota fiscal.

Isto irá adicionar os seguintes campos:

Download de DACTe e XML

Exemplo de como realizar o download do XML de um documento específico.

/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/ctes_recebidas/" + chave + ".xml";

/*
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);

# 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/ctes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+".xml", 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/ctes_recebidas/CHAVE.xml
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 DownloadNotaEspecificaXml {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/ctes_recebidas/"+chave+".xml");

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/ctes_recebidas/" + chave + ".xml"

# 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";
 $chave = "Chave_de_identificação_da_NFe";
// 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/ctes_recebidas/".$chave.".xml");
 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);
// Converte os dados de XML para objeto, mostrando o retorno bruto.
 var_dump(simplexml_load_string($body));
 curl_close($ch);
?>

Exemplo de como fazer o download, no formato JSON, do XML de uma Nota Fiscal Eletrônica especifica.


/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/ctes_recebidas/" + chave + ".json?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);

# 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/ctes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+".json?completa=1", 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/ctes_recebidas/CHAVE.json?completa=1"
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 DownloadNotaEspecifica {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/ctes_recebidas/"+chave+".json?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"

chave = "chave_de_identificacao_da_NFe"

# 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/ctes_recebidas/" + chave + ".json?completa=1"

# 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";
 $chave = "Chave_de_identificação_da_NFe";
// 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/ctes_recebidas/".$chave.".json?completa=1");
 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);
?>

Exemplo de como fazer o download do XML de cancelamento de um documento


/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/ctes_recebidas/" + chave + "/cancelamento.xml";

/*
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);

# 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/ctes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+"/cancelamento.xml", 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/ctes_recebidas/CHAVE/cancelamento.xml
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 DownloadCancelamentoXml {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/ctes_recebidas/"+chave+"/cancelamento.xml");

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/ctes_recebidas/" + chave + "/cancelamento.xml"

# 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";
 $chave = "Chave_de_identificação_da_NFe";
// 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/ctes_recebidas/".$chave."/cancelamento.xml");
 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);
// Converte os dados de XML para objeto, mostrando o retorno bruto.
 var_dump(simplexml_load_string($body));
 curl_close($ch);
?>

Exemplo de como realizar o download do XML de um documento específico com Carta de Correção Eletrônica.


/*
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";

var chave = "chave_da_nota_fiscal";

/*
Para ambiente de producao use a URL abaixo:
"https://api.focusnfe.com.br"
*/
var url = "https://homologacao.focusnfe.com.br/v2/ctes_recebidas/" + chave + "/carta_correcao.xml";

/*
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);

# 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/ctes_recebidas/"

token="token obtido no cadastro da empresa"

chave = "chave_da_nota_fiscal"

r = requests.get(url+chave+"/carta_correcao.xml", 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/ctes_recebidas/CHAVE/carta_correcao.xml
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 DownloadXmlCce {

  public static void main(String[] args) {

    String login = "Token_obtido_no_cadastro_da_empresa";
    String chave = "Chave_de_identificação_da_NFe";

    /* 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/ctes_recebidas/"+chave+"/carta_correcao.xml");

    /* 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"

chave = "chave_de_identificacao_da_NFe"

# 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/ctes_recebidas/" + chave + "/carta_correcao.xml"

# 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";
 $chave = "Chave_de_identificação_da_NFe";
// 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/ctes_recebidas/".$chave."/carta_correcao.xml");
 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);
// Converte os dados de XML para objeto, mostrando o retorno bruto.
 var_dump(simplexml_load_string($body));

   curl_close($ch);
?>

Também é possível fazer o download do XML e do DACTe das notas fiscais através da API, basta informar a chave de identificação da respectiva nota no parâmetro CHAVE:

Baixar o XML de um CTe especifico:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE.xml

Utilize o método HTTP GET para obter os dados no formato XML.

Baixar o DACTe de um CTe especifico:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE.pdf

Utilize o método HTTP GET para obter os dados no formato PDF. Esta requisição irá redirecionar para o endereço onde é salvo o PDF. Caso a sua biblioteca HTTP não consiga seguir requisições de redirecionamento você pode capturar a URL completa no cabeçalho "Location" devolvido pela API.

Baixar o XML, em formato json, de uma nota fiscal especifica:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE.json?completa=1

Utilize o método HTTP GET para obter os dados das notas no formato XML.

Baixar o XML de cancelamento de uma nota fiscal:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE/cancelamento.xml

Utilize o método HTTP GET para obter os dados das notas no formato XML.

Baixar o XML da última Carta de Correção Eletrônica de uma nota fiscal:

https://api.focusnfe.com.br/v2/ctes_recebidas/CHAVE/carta_correcao.xml

Utilize o método HTTP GET para obter os dados das notas no formato XML.

Backups (NFe, NFCe, CTe e MDFe)

Atualmente, realizamos o backup de todos os arquivos XML’s das notas fiscais emitidas pela nossa API. Vale lembrar que o XML é um arquivo com validade legal e deve ser armazenado pelos emitentes, para fins fiscais, por no mínimo 5 anos após a emissão.

Mensalmente a API gera um arquivo compactado em formato ZIP com todos os arquivos gerados de cada empresa.

A consulta dos arquivos de backup pode ser feito com a URL abaixo:

https://api.focusnfe.com.br/v2/backups/CNPJ.json

Utilize o comando HTTP GET para consultar o seu backup em nossa API.

Onde CNPJ é o CNPJ da empresa a ser consultada. Está requisição irá devolver um objeto com os seguintes atributos:

Os backups serão mantidos por pelo menos 6 meses em nossos servidores.

Momentos de geração e cuidados necessários

O backup é gerado no primeiro dia de cada mês e uma parcial do arquivo é gerado todo sábado com as notas emitidas até então.

Para fins de apuração de imposto, recomendamos que a contabilidade responsável valide as notas recebidas, pois algumas exceções podem ocorrer, por exemplo:

Gatilhos / Webhooks

Informações gerais

Gatilhos ou "WebHooks" são eventos automáticos que são disparados a partir de mudanças especificas na nota fiscal. Quando isso ocorre, é enviado os dados da nota fiscal no formato JSON para uma URL da sua escolha através do método POST. Cada acionamento do gatilho contém os dados de apenas uma nota. Abaixo segue um exemplo de como a API enviará as seguintes informações para sua URL, caso a nota autorizada seja uma NFe:

Dados enviados para sua URL:

{
  "cnpj_emitente": "07504505000132",
  "ref": "teste_webhooks",
  "status": "autorizado",
  "status_sefaz": "100",
  "mensagem_sefaz": "Autorizado o uso da NF-e",
  "chave_nfe": "NFe77777075045050001329999930000002999999991249",
  "numero": "1",
  "serie": "1",
  "caminho_xml_nota_fiscal": "/arquivos_development/99999999999972/201313/XMLs/77777075045050001329999930000002999999991249-nfe.xml",
  "caminho_danfe": "/arquivos_development/99999999999972/201313/DANFEs/77777075045050001329999930000002999999991249.pdf"
}

Para NFe e MDe (Manifestação de Destinatário Eletrônica):

Ressaltamos que os campos devolvidos são os mesmos da consulta da nota fiscal. Veja o tópico Consulta na categoria NFe.

Para NFSe:

Ressaltamos que os campos devolvidos são os mesmos da consulta da nota fiscal. Veja o tópico Consulta na categoria NFSe.

Para CTe:

Ressaltamos que os campos devolvidos são os mesmos da consulta da CTe. Veja o tópico Consulta na categoria Cte e CTe OS.

A vantagem de utilizar gatilhos é que não haverá a necessidade de fazer "polling" (realizar constantes requisições a fim de verificar o status da nota).

Na ocorrência de falha na execução do POST para a URL definida (exemplo: servidor fora do ar ou alguma resposta HTTP diferente de 20X) a API tentará um reenvio nos seguintes intervalos: 1 minuto, 30 minutos, 1 hora, 3 horas, 24 horas até o momento em que a API irá desistir de acionar o gatilho.

Status API

Aqui você encontra os status possíveis para os gatilhos (webhooks).

HTTP CODE/STATUS Status API Focus Descrição Correção
404 - not found nao_encontrado Seu gatilho não foi encontrado. Verifique se o seu gatilho foi criado com sucesso. Consulte nossa documentação.
400 - bad request requisicao_invalida Parâmetro "event" deve ser um evento válido. Informe um dos valores esperados para o parâmetro "event" e tente novamente.
400 - bad request requisicao_invalida Já existe um gatilho para este evento. Não é possível ter mais de um gatilho por evento.
400 - bad request requisicao_invalida URL inválida: X Onde X é a URL inválida informado no retorno da API. Consulte nossa documentação.

Eventos

Os seguintes eventos causam o acionamento do gatilho:

Criaçã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/hooks"

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
'''
dados = {}
# é possi utilizar CPF também
# dados["cpf"] = "80032839065"
dados["cnpj"] = "51916585000125"
dados["event"] = "nfe"
dados["url"] = "http://minha.url/nfe"

r = requests.post(url, data=json.dumps(dados), 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":"51916585000125","event":"nfe","url":"http://minha.url/nfe"}' \
  https://homologacao.focusnfe.com.br/v2/hooks
<?php
$ch = curl_init();
$server = "https://homologacao.focusnfe.com.br";
curl_setopt($ch, CURLOPT_URL, $server."/v2/hooks");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array("cnpj" => "51916585000125",
  "event" => "nfe", "url" => "http://minha.url/nfe")));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "token obtido no cadastro da empresa:");
$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 ExemploCriacaoHook {

    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/hooks");

        /* 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> hook = new HashMap<String, String>();

        /*
         é possível utilizar o CPF também
         hook.put("cpf", "80032839065");
        */
        hook.put("cnpj", "51916585000125");
        hook.put("event", "nfe");
        hook.put("url", "http://minha.url/nfe");

        JSONObject json = new JSONObject (hook);

        WebResource request = client.resource(url);

        ClientResponse resposta = request.post(ClientResponse.class, json);

        int httpCode = resposta.getStatus();

        String body = resposta.getEntity(String.class);

        System.out.print("HTTP Code: ");
        System.out.print(HttpCode);
        System.out.printf(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";

var url = "https://homologacao.focusnfe.com.br/v2/hooks";

/*
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 gatilho = {

  "cnpj":"51916585000125",
  "event":"nfe",
  "url":"http://minha.url/nfe"
};

// Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
request.send(JSON.stringify(gatilho));

// Sua aplicacao tera que ser capaz de tratar as respostas da API.
console.log("HTTP code: " + request.status);
console.log("Corpo: " + request.responseText);

Dados de resposta de gatilho criado com sucesso

{
  "id": "Vj5rmkBq",
  "url": "http://minha.url/nfe",
  "authorization": null,
  "authorization_header": null,
  "event": "nfe",
  "cnpj": "51916585000125"
}

Para criar um novo gatilho, utilize o endereço abaixo:

https://api.focusnfe.com.br/v2/hooks

Utilize o método HTTP POST para criar um novo gatilho. Esta requisição aceita os seguintes parâmetros que deverão ser enviados em formato JSON:

A API irá devolver como resposta o gatilho criado. É possível ter mais de um gatilho por evento. Note que o gatilho pode ser por empresa ou um gatilho genérico para todas as emissões feitas usando o token informado.

OBS: Os campos cpf e cnpj são mutuamente excludentes. No caso de informar um deles não informar o outro.

Dicas para uso do campo authorization: O propósito deste campo é garantir que a sua URL não seja acessada por nenhum outro serviço que não o nosso. Sugerimos duas formas de usar este campo: você pode usar um token secreto, por exemplo: "lFNVw8q5WMeR3U9FOVOABTp36zrkvtaa". Desta forma, nossa API irá enviar sempre o seguinte cabeçalho ao acionar o gatilho:

Authorization: lFNVw8q5WMeR3U9FOVOABTp36zrkvtaa

Este cabeçalho poderá ser verificado do lado do seu sistema, rejeitando requisições que não incluam este cabeçalho. Outra forma de utilizar este campo é usando o método Basic Auth. Este método consiste em usar uma string no formato "Basic YWxndW11c3VhcmlvOmFsZ3VtYXNlbmhh", onde a última string é o resultado da concatenação de "algumusuario:algumasenha", e depois aplicada a codificação em Base64. Usando este método, você poderá usar alguma biblioteca disponível na sua linguagem de programação e simplesmente testar o recebimento do usuário "algumusuario" com a senha "algumasenha".

Se você utiliza um outro esquema de autenticação, você pode especificar tanto os campos authorization quanto authorization_header. Por exemplo, se sua aplicação espera o campo "X-ApiKey" com o valor "IlzJYBLJBxQT1FUGNRxhFO1ASpNKfj8z" você deverá informar estes valores nos campos authorization_header e authorization, respectivamente. Desta forma, nossa API irá enviar o seguinte cabeçalho ao acionar o gatilho:

X-ApiKey: IlzJYBLJBxQT1FUGNRxhFO1ASpNKfj8z

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/hooks/"

token="token obtido no cadastro da empresa"

hook_id = "Vj5rmkBq"

r = requests.get(url+hook_id, 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/hooks/Vj5rmkBq
<?php
$ch = curl_init();
$hook_id = "Vj5rmkBq"
$server = "https://homologacao.focusnfe.com.br";
curl_setopt($ch, CURLOPT_URL, $server."/v2/hooks/" . $hook_id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "token obtido no cadastro da empresa:");
$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 ExemploConsultaHook {

    public static void main(String[] args){

        String login = "Token_obtido_no_cadastro_da_empresa";

        /* Substituir pela sua identificação interna da nota. */
        String hookId = "Vj5rmkBq";

        /* 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/hooks/"+hookId);

        /* 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);
    }
}

/*
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";

var hook_id = "n65g0RP1";

var url = "https://homologacao.focusnfe.com.br/v2/hooks/" + hook_id;

/*
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);

Dados de resposta de consulta de um gatilho individual

{
  "id": "Vj5rmkBq",
  "url": "http://minha.url/nfe",
  "authorization": null,
  "authorization_header": null,
  "event": "nfe",
  "cnpj": "51916585000125"
}

Existem duas formas de consultar os gatilhos disponíveis, utilize o endereço abaixo:

https://api.focusnfe.com.br/v2/hooks

Utilize o método HTTP GET para consultar todos os gatilhos criados. Serão exibidos os gatilhos de todas as empresas que seu token possui acesso.

Para consultar apenas um gatilho individualmente, utilize a URL:

https://api.focusnfe.com.br/v2/hooks/HOOK_ID

Substituindo HOOK_ID pelo identificador do gatilho.

Exclusão

 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/hooks/"

token="token obtido no cadastro da empresa"

hook_id = "Vj5rmkBq"

r = requests.delete(url+hook_id, 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 \
 https://homologacao.focusnfe.com.br/v2/hooks/Vj5rmkBq
<?php
$ch = curl_init();
$hook_id = "Vj5rmkBq"
$server = "https://homologacao.focusnfe.com.br";
curl_setopt($ch, CURLOPT_URL, $server . "/v2/hooks/" . $hook_id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "token obtido no cadastro da empresa:");
$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);
?>
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 ExemploExclusaoHook {

    public static void main(String[] args){

        String login = "Token_obtido_no_cadastro_da_empresa";

        /* Substituir pela sua identificação interna da nota. */
        String hookId = "Vj5rmkBq";

        /* 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/hooks/"+hookId);

        /* 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);

        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);
    }
}

/*
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";

var hook_id = "n65g0RP1";

var url = "https://homologacao.focusnfe.com.br/v2/hooks/" + hook_id;

/*
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);

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);

Dados de resposta da exclusão de um gatilho

{
  "id": "Vj5rmkBq",
  "url": "http://minha.url/nfe",
  "authorization": null,
  "authorization_header": null,
  "event": "nfe",
  "cnpj": "51916585000125",
  "deleted": true
}

Para excluir um gatilho, utilize a URL

https://api.focusnfe.com.br/v2/hooks/HOOK_ID

Utilize o método HTTP DELETE para excluir o gatilho. Em caso de sucesso será exibido os dados do gatilho excluído acrescentado do atributo "deleted" com o valor "true".

Teste e reenvio de notificações

Para efeitos de teste ou para recuperar notificações perdidas é possível solicitar à API o reenvio desta notificação para todos os gatilhos cadastrados.

Para isso é disponibilizado um endereço para cada tipo de documento que aceita gatilhos. Basta enviar uma requisição POST para os endereços abaixo:

Dados de resposta da solicitação de reenvio de notificação de uma NFe

[

  {
    "id": "Vj5rmkBq",
    "url": "http://minha.url/nfe",
    "authorization": null,
    "authorization_header": null,
    "event": "nfe",
    "cnpj": "51916585000125",
  }
]

O corpo da requisição do método POST pode ser vazio.

Caso a nota seja encontrada, será devolvido um array contendo todos os gatilhos que foram acionados ou um array vazio se não houver gatilhos cadastrados.

Consulta de emails

Fazemos um controle de "reputação" de nosso serviço de email, de forma a diminuir a chance dos emails enviados serem considerados spam pelos servidores de destino. Alguns aspectos que afetam a reputação de envio:

Supõe-se que servidores que enviam muitos emails com problemas são servidores utilizados para enviar email não solicitado (spam).

Desta forma mantemos uma lista de emails onde foi identificado algum problema. Assim a API não irá tentar enviar novamente um email para este endereço, ignorando o envio se necessário. Com isto procuramos manter nossa taxa de erros baixa para que os demais servidores de emails da Internet confiem em nosso serviço.

Nós mantemos uma API para que possa ser consultado quais emails não irão receber nossas mensagens devido a alguns dos problemas acima. Em alguns casos é possível solicitar a remoção do endereço de email com problema de forma que nossa API possa tentar novamente o envio em uma próxima ocasião.

URLs

Método URL (recurso) Ação
GET /v2/blocked_emails/EMAIL Consulta um possível email bloqueado
DELETE /v2/blocked_emails/EMAIL Solicita exclusão do bloqueio

Consulta de email bloqueado

Utilize o método GET com o endereço abaixo:

https://api.focusnfe.com.br/v2/blocked_emails/EMAIL

Este endereço não faz diferenciação entre ambientes (homologação e produção) pois ambos utilizam o mesmo serviço de envio de emails.

curl -u "token obtido no cadastro da empresa:" \
  "https://api.focusnfe.com.br/v2/blocked_emails/test@example.com"

Exemplo de resposta de email bloqueado

{
  "email": "test@example.com",
  "block_type": "bounce",
  "bounce_type": "transient",
  "diagnostic_code": "smtp; 554 4.4.7 Message expired: unable to deliver in 1440 minutes.<421 4.4.0 Unable to lookup DNS for example.com>",
  "blocked_at": "2020-04-16T12:24:29-03:00"
}

Exemplo de resposta de email não encontrado

{
  "codigo": "nao_encontrado",
  "mensagem": "Email não encontrado na lista de bloqueios"
}

A API irá devolver o status HTTP 200 se o email for encontrado ou 404 se não for encontrado.

Os campos devolvidos são descritos abaixo:

Solicitação de exclusão de email bloqueado

É possível solicitar a exclusão de um bloqueio, e caso ele seja aceito, o email será removido da lista de bloqueio podendo ser utilizado novamente.

Utilize o método DELETE com o endereço abaixo:

https://api.focusnfe.com.br/v2/blocked_emails/EMAIL

curl -X DELETE -u "token obtido no cadastro da empresa:" \
  "https://api.focusnfe.com.br/v2/blocked_emails/test@example.com"

Exemplo de resposta de solicitação não atendida

{
  "codigo": "requisicao_invalida",
  "mensagem": "Email bloqueado por motivo de reclamação não pode ser excluído. Entre em contato com o suporte."
}

Caso o endereço de email seja excluído, será devolvido o status HTTP 200. Caso o email não seja encontrado, será devolvido o status 404. Por fim, se o email existir mas não ser possível sua exclusão será devolvido o status HTTP 422.

Alguns endereços podem ter sua solicitação de exclusão negada, como por exemplo endereços cujo destinatário marcou alguma mensagem enviada pelo nosso servidor como spam. Neste caso, contate o suporte técnico para entendermos melhor a sua solicitação.

Consulta de NCM

NCM significa "Nomenclatura Comum do Mercosul" e trata-se de um código de oito dígitos estabelecido através da convenção de categorização de mercadorias adotada desde 1995 pelo Uruguai, Paraguai, Brasil e Argentina e que toma por base o Sistema Harmonizado (SH). Este código é utilizado na emissão de NFe e de NFCe.

Nós disponibilizamos uma API que você poderá utilizar para fornecer ao seu usuário final uma pesquisa de qual o código NCM correto do seu produto.

O código NCM é formato por 8 dígitos no seguinte formato:

CCPPSÇII, sendo:

# pesquisa por códigos NCM do capítulo 90
curl -u "token obtido no cadastro da empresa:" \
  https://homologacao.focusnfe.com.br/v2/ncms?capitulo=90
<?php
$ch = curl_init();
$server = "https://homologacao.focusnfe.com.br";
curl_setopt($ch, CURLOPT_URL, $server."/v2/ncms?capitulo=90");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "token obtido no cadastro da empresa:");
$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 ExemploConsultaHook {

    public static void main(String[] args){

        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/ncms?capitulo=90");

        /* 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"

# 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/ncms?capitulo=90"

# 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::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

# 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/ncms?capitulo=90"

token="token obtido no cadastro da empresa"

r = requests.get(url, auth=(token,""))

# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)


/*
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/ncms?capitulo=90";

/*
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);

// Aqui enviamos a requisição.
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);

Dados de resposta da consulta

[
 {
   "codigo": "90049090",
   "descricao_completa": "Óculos para correção, proteção ou outros fins, e artigos semelhantes. Outros Outros",
   "capitulo": "90",
   "posicao": "04",
   "subposicao1": "9",
   "subposicao2": "0",
   "item1": "9",
   "item2": "0"
 },
 {
   "codigo": "90051000",
   "descricao_completa": "Binóculos, lunetas, incluindo as astronômicas, telescópios ópticos, e suas armações, outros instrumentos de astronomia e suas armações, exceto os aparelhos de radioastronomia. Binóculos",
   "capitulo": "90",
   "posicao": "05",
   "subposicao1": "1",
   "subposicao2": "0",
   "item1": "0",
   "item2": "0"
 },
 {
   "codigo": "90058000",
   "descricao_completa": "Binóculos, lunetas, incluindo as astronômicas, telescópios ópticos, e suas armações, outros instrumentos de astronomia e suas armações, exceto os aparelhos de radioastronomia. Outros instrumentos",
   "capitulo": "90",
   "posicao": "05",
   "subposicao1": "8",
   "subposicao2": "0",
   "item1": "0",
   "item2": "0"
 },
 {
   "codigo": "90059010",
   "descricao_completa": "Binóculos, lunetas, incluindo as astronômicas, telescópios ópticos, e suas armações, outros instrumentos de astronomia e suas armações, exceto os aparelhos de radioastronomia. Partes e acessórios (incluindo as armações) De binóculos",
   "capitulo": "90",
   "posicao": "05",
   "subposicao1": "9",
   "subposicao2": "0",
   "item1": "1",
   "item2": "0"
 }
]

Para consultar os NCMs disponíveis, utilize o endereço abaixo:

https://homologacao.focusnfe.com.br/v2/ncms

Utilize o método HTTP GET. São aceitos os seguintes parâmetros de pesquisa:

Caso já saiba o código NCM exato, e queira apenas recuperar sua descrição, utilize o link abaixo, substituindo CODIGO_NCM pelo código.

https://homologacao.focusnfe.com.br/v2/ncms/CODIGO_NCM

Paginação

Ao fazer uma pesquisa, a API irá devolver o cabeçalho HTTP X-Total-Count que representa o número total de ocorrências da pesquisa, porém a API devolve apenas 50 registros por vez. Para buscar os demais registros, utilize o parâmetro offset. Exemplo:

Vamos supor que a chamada abaixo devolva 123 ocorrências:

https://homologacao.focusnfe.com.br/v2/ncms?codigo=7022

A segunda e terceira páginas da consulta poderão ser acessados desta forma:

Registros 51 a 100: https://homologacao.focusnfe.com.br/v2/ncms?codigo=7022&offset=50

Registros 101 a 123: https://homologacao.focusnfe.com.br/v2/ncms?codigo=7022&offset=100

Consulta de CFOP

CFOP significa "Código Fiscal de Operações e Prestações" e trata-se de um código de quatro dígitos que serve para identificar operações que envolvam a incidência de ICMS ou IPI.

Nós disponibilizamos uma API que você poderá utilizar para fornecer ao seu usuário final uma pesquisa de qual o código CFOP correto para a operação realizada.

O código CFOP é formato por 4 dígitos, sendo que o primeiro digito indica se a operação é de entrada ou saída e também a localização da contraparte: mesma UF, outra UF ou exterior. Exemplo:

Entradas

Saídas

Por exemplo, o código 5101 refere-se a venda de produção do estabelecimento para um cliente do mesmo estado.

# pesquisa por CFOPs que iniciam com o dígito 2
curl -u "token obtido no cadastro da empresa:" \
  https://homologacao.focusnfe.com.br/v2/cfops?codigo=2
<?php
$ch = curl_init();
$server = "https://homologacao.focusnfe.com.br";
curl_setopt($ch, CURLOPT_URL, $server."/v2/cfops?codigo=2");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "token obtido no cadastro da empresa:");
$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 ExemploConsultaHook {

    public static void main(String[] args){

        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/cfops?codigo=2");

        /* 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"

# 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/cfops?codigo=2"

# 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::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

# 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/cfops?codigo=2"

token="token obtido no cadastro da empresa"

r = requests.get(url, auth=(token,""))

# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)


/*
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/cfops?codigo=2";

/*
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);

// Aqui enviamos a requisição.
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);

Dados de resposta da consulta

[
 {
    "codigo": "2151",
    "descricao": "2151 - Transferência p/ industrialização ou produção rural"
  },
  {
    "codigo": "2152",
    "descricao": "2152 - Transferência p/ comercialização"
  },
  {
    "codigo": "2153",
    "descricao": "2153 - Transferência de energia elétrica p/ distribuição"
  },
  {
    "codigo": "2154",
    "descricao": "2154 - Transferência p/ utilização na prestação de serviço"
  },
  {
    "codigo": "2159",
    "descricao": "2159 - Entrada decorrente do fornecimento de produto ou mercadoria de ato cooperativo"
  },
  {
    "codigo": "2201",
    "descricao": "2201 - Devolução de venda de produção do estabelecimento"
  },
  {
    "codigo": "2202",
    "descricao": "2202 - Devolução de venda de mercadoria adquirida ou recebida de terceiros"
  }
]

Para consultar os CFOPs disponíveis, utilize o endereço abaixo:

https://homologacao.focusnfe.com.br/v2/cfops

Utilize o método HTTP GET. São aceitos os seguintes parâmetros de pesquisa:

Caso já saiba o código CFOP exato, e queira apenas recuperar sua descrição, utilize o link abaixo, substituindo CODIGO_CFOP pelo código.

https://homologacao.focusnfe.com.br/v2/cfops/CODIGO_CFOP

Paginação

Ao fazer uma pesquisa, a API irá devolver o cabeçalho HTTP X-Total-Count que representa o número total de ocorrências da pesquisa, porém a API devolve apenas 50 registros por vez. Para buscar os demais registros, utilize o parâmetro offset. Exemplo:

Vamos supor que a chamada abaixo devolva 123 ocorrências:

https://homologacao.focusnfe.com.br/v2/cfops?codigo=2

A segunda e terceira páginas da consulta poderão ser acessados desta forma:

Registros 51 a 100: https://homologacao.focusnfe.com.br/v2/cfops?codigo=2&offset=50

Registros 101 a 123: https://homologacao.focusnfe.com.br/v2/cfops?codigo=2&offset=100

Consulta de CEP (beta)

O Código de Endereçamento Postal - CEP - é um código utilizado pelo Correrios para fins de encaminhamento, tratamento e distribuição de postagens. O código, formado por oito digitos numéricos, é dividio em duas partes:

a) a primeira é composta por 5 (cinco) dígitos que representam Região, Sub-região, Setor, Subsetor e Divisor de Subsetor;

b) a segunda é composta por 3 (três) dígitos, separada por um traço da primeira, que representa os Identificadores de Distribuição.

Os 8 dígitos do CEP seguem o seguinte formato:

RSRSSSD-PREFIXO, sendo:

Nós disponibilizamos uma API para consultar uma descrição detalhada das informações do CEP.

# pesquisa por CFOPs que iniciam com o dígito 2
curl -u "token obtido no cadastro da empresa:" \
  https://homologacao.focusnfe.com.br/v2/ceps?uf=AC&logradouro=colinas
<?php
$ch = curl_init();
$server = "https://homologacao.focusnfe.com.br";
curl_setopt($ch, CURLOPT_URL, $server."/v2/ceps?uf=AC&logradouro=colinas");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "token obtido no cadastro da empresa:");
$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 ExemploConsultaHook {

    public static void main(String[] args){

        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/ceps?uf=AC&logradouro=colinas");

        /* 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"

# 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/ceps?uf=AC&logradouro=colinas"

# 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::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

# 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/ceps?uf=AC&logradouro=colinas"

token="token obtido no cadastro da empresa"

r = requests.get(url, auth=(token,""))

# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)


/*
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/ceps?uf=AC&logradouro=colinas";

/*
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);

// Aqui enviamos a requisição.
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 realizar uma consulta de CEP, utilize o endereço abaixo:

https://homologacao.focusnfe.com.br/v2/ceps

Utilize o método HTTP GET. São aceitos os seguintes parâmetros de pesquisa:

É necessário informar ao menos dois parâmetros para consulta.

No caso especial de Municípios que possuem um único CEP (não dividido em logradouros), é possível realizar a consulta informando apenas o codigo_ibge como parâmetro.

Caso já saiba o CEP exato, e queira apenas recuperar sua descrição, utilize o link abaixo, substituindo CODIGO_CEP pelo código.

https://api.focusnfe.com.br/v2/ceps/CODIGO_CEP

Resposta da API

Dados de resposta da consulta

[
  {
    "cep": "69909032",
    "tipo": "logradouro",
    "nome": "",
    "uf": "AC",
    "nome_localidade": "Rio Branco",
    "codigo_ibge": "1200401",
    "tipo_logradouro": "Rua",
    "nome_logradouro": "Colinas",
    "nome_bairro_inicial": "Rosa Linda",
    "descricao": "Rua Colinas, Rio Branco, AC"
  }
]

Para cada consulta à nossa API de CEP a resposta trará um ou mais objetos JSON, com os campos como neste exemplo ao lado. Abaixo, a descrição de cada um dos campos:

Consulta de CNAE

CNAE significa "Classificação Nacional de Atividades Econômicas" e trata-se de um código numérico responsável por classificar as atividades econômicas no Brasil.

Nós disponibilizamos uma API que pode ser utilizada para consultar uma base que contém a lista de códigos CNAE do IBGE, assim como a descrição de cada atividade econômica categorizada pelo código.

# pesquisa por todos os códigos CNAE que possuem 'informática' em sua descrição
curl -u "token obtido no cadastro da empresa:" \
  https://homologacao.focusnfe.com.br/v2/codigos_cnae?descricao=informatica
<?php
$ch = curl_init();
$server = "https://homologacao.focusnfe.com.br";
curl_setopt($ch, CURLOPT_URL, $server."/v2/codigos_cnae?descricao=informatica");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "token obtido no cadastro da empresa:");
$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 ExemploConsultaHook {

    public static void main(String[] args){

        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/codigos_cnae?descricao=informatica");

        /* 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"

# 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/codigos_cnae?descricao=informatica"

# 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::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

# 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/codigos_cnae?descricao=informatica"

token="token obtido no cadastro da empresa"

r = requests.get(url, auth=(token,""))

# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)


/*
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/codigos_cnae?descricao=informatica";

/*
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);

// Aqui enviamos a requisição.
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);

Disponibilizamos o seguinte método de consulta:

Método URL (recurso) Ação
GET /v2/codigos_cnae Busca todos os códigos CNAE ou filtra-os de acordo com parâmetros

Os parâmetros disponíveis para consulta dos códigos CNAE são atualmente os seguintes:

Caso já saiba o código CNAE exato, você pode efetuar a busca diretamente em:

Resposta da API

Exemplo de dados de resposta da consulta

[
  {
    "codigo": "8599603",
    "descricao": "Treinamento em informática"
  },
  {
    "codigo": "4757100",
    "descricao": "Comércio varejista especializado de peças e acessórios para aparelhos eletroeletrônicos para uso doméstico, exceto informática e comunicação"
  },
  {
    "codigo": "4751202",
    "descricao": "Recarga de cartuchos para equipamentos de informática"
  }
]

Para cada consulta à nossa API de códigos CNAE a resposta trará um ou mais objetos JSON, com os campos como neste exemplo ao lado. Abaixo, a descrição de cada um dos campos:

Paginação

Ao fazer uma pesquisa, a API irá devolver o cabeçalho HTTP X-Total-Count que representa o número total de ocorrências da pesquisa, porém a API devolve apenas 50 registros por vez. Para buscar os demais registros, utilize o parâmetro offset. Exemplo:

Vamos supor que a chamada abaixo devolva 123 ocorrências:

https://homologacao.focusnfe.com.br/v2/codigos_cnae?codigo=2

A segunda e terceira páginas da consulta poderão ser acessados desta forma:

Registros 51 a 100: https://homologacao.focusnfe.com.br/v2/codigos_cnae?codigo=2&offset=50

Registros 101 a 123: https://homologacao.focusnfe.com.br/v2/codigos_cnae?codigo=2&offset=100

Consulta de Municípios (beta)

Utilizamos a base de municípios do IBGE para identificar os municípios em nossa API. Desta forma disponibilizamos uma API para busca dos municípios cadastrados, seja para localizá-los pelo nome, para recuperar o código do município, verificar se o município tem a NFSe implementada em nosso sistema ou demais especificidades de cada município. Ainda, é possível verificar se determinado município apresenta a necessidade de informar o código tributário do município e/ou item da lista de serviço para emissão de uma nota fiscal de serviço. Com isso, é possível verificar os valores que esses campos devem receber através de uma consulta relacionada ao próprio município.

# pesquisa por todos os municípios do PR
curl -u "token obtido no cadastro da empresa:" \
  https://homologacao.focusnfe.com.br/v2/municipios?sigla_uf=PR

# pesquisa pelos itens da lista de serviço que contém a descrição "informática" por um município onde esse campo seja obrigatório.
curl -u "token obtido no cadastro da empresa:" \
  https://homologacao.focusnfe.com.br/v2/municipios/4307807/itens_lista_servico?descricao=informatica
<?php
$ch = curl_init();
$server = "https://homologacao.focusnfe.com.br";
curl_setopt($ch, CURLOPT_URL, $server."/v2/municipios?sigla_uf=PR");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "token obtido no cadastro da empresa:");
$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 ExemploConsultaHook {

    public static void main(String[] args){

        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/municipios?sigla_uf=PR");

        /* 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"

# 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/municipios?sigla_uf=PR"

# 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::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

# 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/municipios?sigla_uf=PR"

token="token obtido no cadastro da empresa"

r = requests.get(url, auth=(token,""))

# Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
print(r.status_code, r.text)


/*
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/municipios?sigla_uf=PR";

/*
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);

// Aqui enviamos a requisição.
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);

Disponibilizamos os seguintes métodos de consulta:

Método URL (recurso) Ação
GET /v2/municipios Busca todos os municípios ou filtra-os de acordo com parâmetros
GET /v2/municipios/CODIGO_MUNICIPIO Busca um município único pelo seu código
GET /v2/municipios/CODIGO_MUNICIPIO/itens_lista_servico Busca todos os itens da lista de serviço de acordo com o município ou filtra-os de acordo com parâmetros
GET /v2/municipios/CODIGO_MUNICIPIO/itens_lista_servico/CODIGO Busca um item da lista de serviço único pelo seu código de acordo com o município
GET /v2/municipios/CODIGO_MUNICIPIO/codigos_tributarios_municipio Busca todos os códigos tributários municípais de acordo com o município ou filtra-os de acordo com parâmetros
GET /v2/municipios/CODIGO_MUNICIPIO/codigos_tributarios_municipio/CODIGO Busca um código tributário municipal único pelo seu código de acordo com o município

Os parâmetros disponíveis para consulta dos municípios são atualmente os seguintes:

Caso já saiba o código exato do município, você pode efetuar a busca diretamente em:

Os parâmetros disponíveis para consulta dos itens da lista de serviço e códigos tributários municipais de acordo com o município são atualmente os seguintes:

Caso já saiba o código exato do item da lista de serviço ou do código tributário municipal, você pode efetuar a busca diretamente em:

Resposta da API

Exemplo de dados de resposta da consulta aos municípios

[
  {
    "codigo_municipio": "4204806",
    "nome_municipio": "Curitibanos",
    "sigla_uf": "SC",
    "nome_uf": "Santa Catarina",
    "nfse_habilitada": false
  },
  {
    "codigo_municipio": "4106902",
    "nome_municipio": "Curitiba",
    "sigla_uf": "PR",
    "nome_uf": "Paraná",
    "nfse_habilitada": true,
    "requer_certificado_nfse": true,
    "possui_ambiente_homologacao_nfse": true,
    "possui_cancelamento_nfse": true,
    "provedor_nfse": "Tecnos",
    "endereco_obrigatorio_nfse": null,
    "cpf_cnpj_obrigatorio_nfse": null,
    "codigo_cnae_obrigatorio_nfse": true,
    "item_lista_servico_obrigatorio_nfse": false,
    "codigo_tributario_municipio_obrigatorio_nfse": false
  }
]

Exemplo de dados de resposta da consulta aos itens da lista de serviço de um determinado município

[
  {
    "codigo": "1.06",
    "descricao": "Assessoria e consultoria em informática.",
    "tax_rate": null
  },
  {
    "codigo": "1.07",
    "descricao": "Suporte técnico em informática, inclusive instalação, configuração e manutenção de programas de computação e bancos de dados.",
    "tax_rate": null
  }
]

Para cada consulta à nossa API de municípios a resposta trará um ou mais objetos JSON, com os campos como neste exemplo ao lado. Abaixo, a descrição de cada um dos campos:

Considere que novos campos poderão ser adicionados nesta API.

Paginação

Ao fazer uma pesquisa, a API irá devolver o cabeçalho HTTP X-Total-Count que representa o número total de ocorrências da pesquisa, porém a API devolve apenas 100 registros por vez. Para buscar os demais registros, utilize o parâmetro offset. Exemplo:

Vamos supor que a chamada abaixo devolva 223 ocorrências:

https://homologacao.focusnfe.com.br/v2/municipios?sigla_uf=PR

A segunda e terceira páginas da consulta poderão ser acessados desta forma:

Registros 101 a 200: `https://homologacao.focusnfe.com.br/v2/municipios?sigla_uf=PR&offset=100

Registros 201 a 223: `https://homologacao.focusnfe.com.br/v2/municipios?sigla_uf=PR&offset=200

Consulta de CNPJ

O Cadastro Nacional de Pessoa Jurídica - CNPJ - compreende as informações cadastrais das entidades de interesse das administrações tributárias da União, dos estados, do Distrito Federal e dos municípios. Ao cadastro da pessoa jurídica é atribuído a um ou mais números de inscrição no CNPJ. Este número de inscrição é formado por (14) dígitos e composto de três partes e representado usando a seguinte notação:

XX.XXX.XXX/YYYY-ZZ

a) a primeira parte é composta de oito dígitos (XX.XXX.XXX) que formam o número base. Ele identifica a empresa;

b) a segunda parte é composta de quatro dígitos (YYYY) que formam o número de ordem. Ele identifica se o cadastro se refere a matriz ou à filiais (0001 - matriz, ou 0002 - filial 1, 0003 - filial 2,...);

c) a terceira parte é composta de dois dígitos (ZZ) que formam o dígito verificador. Ele tem como função verificar se o conteúdo do número base e de origem são válidos.

A FocusNFe disponibiliza uma API que permite consultar alguns dos dados presentes no Cadastro Nacional de Pessoa Jurídica.

A API usa como base dados fornecidos trimestralmente pela Receita Federal.

# Pesquisar dados de cadastro do número de inscrição 07.504.505/0001-32
curl -u <token obtido no cadastro da empresa> https://api.focusnfe.com.br/v2/cnpjs/07504505000132
<?php
$ch = curl_init();
$server = "https://api.focusnfe.com.br";
curl_setopt($ch, CURLOPT_URL, $server."/v2/cnpjs/07504505000132");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array());
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "token obtido no cadastro da empresa:");
$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 ExemploConsultaHook {

    public static void main(String[] args){

        String login = "Token_obtido_no_cadastro_da_empresa";

        String server = "https://api.focusnfe.com.br/";

        String url = server.concat("/v2/cnpjs/07504505000132");

        /* 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"

# endereço da api
servidor = "https://api.focusnfe.com.br/"

url_envio = servidor + "v2/cnpjs/07504505000132"

# 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::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
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

# Faça o download e instalação da biblioteca requests, através do python-pip.
import requests

url = "https://api.focusnfe.com.br/v2/cnpjs/07504505000132"

token="token obtido no cadastro da empresa"

r = requests.get(url, auth=(token,""))

# Mostra na tela o codigo HTTP da requisicão e a mensagem de retorno da API
print(r.status_code, r.text)


/*
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";


var url = "https://api.focusnfe.com.br/v2/cnpjs/07504505000132"

/*
Use o valor 'false', como terceiro parametro para que a requisição aguarde a resposta da API
Passamos o token como quarto paramâtro deste metodo, como autenticador do HTTP Basic Authentication.
*/
request.open('GET', url, false, token);

// Aqui enviamos a requisição.
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 realizar uma consulta cadastro de uma empresa, utilize o endereço abaixo substituindo o "resource ID" INSCRICAO_CNPJ pelo número de inscrição no CNPJ:

https://api.focusnfe.com.br/v2/cnpjs/INSCRICAO_CNPJ

Utilize o método HTTP GET.

A pesquisa só poderá ser feita usando o número completo de inscrição no CNPJ, com seus 14 dígitos completos. Não é suportado nesse momento uma busca aproximada através de um número de identificação de CNPJ parcial e só é possível executar a consulta ao cadastro de um número de CNPJ por requisição.

Devem ser usados apenas os números que compõem o identificador, sem os ".","/" e "=". Ou seja, se identificador do CNPJ é 02.123.123/0001-56, a requisição seria feita usando a notação 02123123000156.

É necessário ter um token de autenticação emitido pela FocusNFe para poder executar a requisição.

A requisição REST devolve um JSON no corpo (body) da resposta com seguintes dados de cadastro:

Resposta da API

Dados de resposta da consulta

{
    "razao_social": "ACRAS TECNOLOGIA DA INFORMACAO LTDA",
    "cnpj": "07504505000132",
    "situacao_cadastral": "ativa",
    "cnae_principal": "6209100",
    "optante_simples_nacional": false,
    "optante_mei": false,
    "endereco": {
      "codigo_municipio": "7535",
      "codigo_siafi": "7535",
      "codigo_ibge": "4106902",
      "nome_municipio": "CURITIBA",
      "logradouro": " XV DE NOVEMBRO",
      "complemento": "Conj 602 Andar 06 Cond Eugenia Campos Ed",
      "numero": "1234",
      "bairro": "CENTRO",
      "cep": "80060000",
      "uf": "PR"
    }
}

Para cada consulta à API de CNPJs a resposta trará um objeto JSON, com os campos como neste exemplo ao lado. Abaixo, a descrição de cada um dos campos:

Empresas

A API para empresas consiste em uma série de métodos para criar e habilitar automaticamente uma empresa para emissão de documentos fiscais (NFe, NFCe ou NFSe). São disponibilizados os métodos para criar uma empresa, buscar dados de uma empresa ou listar todas as empresas. Cada empresa possui um identificador único (campo id) que você deverá armazenar em sua base de dados para poder alterar ou buscar dados da empresa posteriormente.

Ambientes

A API de Empresas opera exclusivamente no ambiente de produção, não sendo possível realizar operações em homologação. Porém, quando aplicável, adicionamos o parâmetro opcional dry_run=1 que permite que a criação da empresa seja simulada sem que seja efetivamente efetuada no nosso banco de dados. Desta forma você poderá testar as chamadas antes de implementá-las em produção.

Uma vez criada a empresa no ambiente de produção, você poderá emitir documentos fiscais no ambiente de homologação e produção usando esta empresa.

URLs

Método URL (recurso) Ação
POST /v2/empresas Cria uma nova empresa.
GET /v2/empresas Consulta todas as empresas.
GET /v2/empresas/ID Consulta uma a empresa a partir do seu identificador.
PUT /v2/empresas/ID Altera os dados de uma empresa específica.
DELETE /v2/empresas/ID Exclui uma empresa

Campos

O formato de envio dos campos é no formato JSON, que deverá ser enviado no formato:

{empresa: {atributo1: valor1, atributo2: valor2, … } }

Abaixo são listados todos os campos de uma empresa.

Exemplo de um arquivo JSON de envio

{
   "nome":"Nome da empresa Ltda",
   "nome_fantasia":"Nome Fantasia",
   "bairro":"Vila Isabel",
   "cep":80210000,
   "cnpj":"10964044000164",
   "complemento":"Loja 1",
   "discrimina_impostos":true,
   "email":"test@example.com",
   "enviar_email_destinatario":true,
   "inscricao_estadual":1234,
   "inscricao_municipal":46532,
   "logradouro":"Rua João da Silva",
   "numero":153,
   "regime_tributario":1,
   "telefone":"4130333333",
   "municipio":"Curitiba",
   "uf":"PR",
   "habilita_nfe":true,
   "habilita_nfce":true,
   "arquivo_certificado_base64":"MIIj4gIBAzCCI54GCSqGSIb3DQEHAaCC..apagado…ASD==",
   "senha_certificado":123456,
   "csc_nfce_producao":"ABCDEF",
   "id_token_nfce_producao":"00001"
}
Campo Tipo Obrig. NFe Obrig. NFCe Obrig. NFSe Descrição
nome texto Sim Sim Sim Razão social da empresa
nome_fantasia texto Sim Sim Sim Nome fantasia
inscricao_estadual numérico Sim Sim Inscrição estadual
inscricao_municipal numérico Sim Inscrição municipal
cnpj numérico Sim Sim Sim CNPJ
regime_tributario enumeração Sim Sim Sim "Regime tributário. Valores possíveis: 1 - Simples Nacional; 2 - Simples Nacional - Excesso de sublimite de receita bruta; 3 - Regime Normal
email email Sim Sim Sim Email de contato da empresa
telefone numérico Sim Sim Telefone da empresa
logradouro texto Sim Sim Sim Endereço: logradouro
numero numérico Sim Sim Sim Endereço: número
complemento texto Endereço: complemento
bairro texto Sim Sim Sim Endereço: bairro
cep numérico Sim Sim Sim Endereço: CEP completo
municipio texto Sim Sim Sim Endereço: nome do município sem abreviações
uf texto Sim Sim Sim Endereço: UF com 2 caracteres
enviar_email_destinatario booleano Habilita ou não envio de e-mail ao destinatário/tomador do serviço após emissão do documento fiscal
discrimina_impostos booleano N/A Habilita ou não o cálculo automático de impostos totais aproximados de acordo com a Lei da Transparência. Não é utilizado para NFSe.
cpf_cnpj_contabilidade numérico N/A CPF/CNPJ da contabilidade da empresa. Alguns estados necessitam que esta informação seja adicionado (no momento apenas BA obriga).
habilita_nfe booleano Sim N/A N/A Informa se empresa será habilitada para emissão de NFe – Nota Fiscal Eletrônica modelo 55
habilita_nfce booleano N/A Sim N/A Informa se empresa será habilitada para emissão de NFCe – Nota Fiscal ao Consumidor Eletrônica modelo 65
habilita_nfse booleano N/A N/A Sim Informa se empresa será habilitada para emissão de NFSe – Nota Fiscal de Serviço Eletrônica
habilita_cte booleano N/A N/A N/A Informa se empresa será habilitada para emissão de CTe ou CTeOS (Conhecimento de Transporte)
habilita_mdfe booleano N/A N/A N/A Informa se empresa será habilitada para emissão de MDFe (Manifesto Eletrônico de Documentos Fiscais - usado por emitentes de CTe)
habilita_manifestacao booleano N/A N/A N/A Informa se empresa será habilitada para busca de NFe recebidas para realização de manifestação do destinatário (MDe)
habilita_manifestacao_cte booleano N/A N/A N/A Informa se empresa será habilitada para busca de CTes recebidas
habilita_contingencia_offline_nfce booleano N/A N/A N/A Informa se empresa será habilitada para contingência offline de NFCe
reaproveita_numero_nfce_contingencia booleano N/A N/A N/A Informa se empresa será habilitada para reaproveitar número de NFCe emitido em contingência
orientacao_danfe texto Não N/A N/A Orientação da DANFe. Valores possíveis: portrait, para orientação retrato; ou ladscape, para orientação paisagem.
recibo_danfe booleano Não N/A N/A Informa se empresa será habilitada para exibir recibo na DANFe.
exibe_sempre_ipi_danfe booleano Não N/A N/A Informa se empresa será habilitada para imprimir sempre colunas do IPI
exibe_issqn_danfe booleano Não N/A N/A Informa se empresa será habilitada para mostra dados do ISSQN
exibe_impostos_adicionais_danfe booleano Não N/A N/A Informa se empresa será habilitada para imprimir impostos adicionais na DANFe (II, PIS, COFINS, ICMS UF Destino, ICMS UF Remetente, valor total tributos)
exibe_sempre_volumes_danfe booleano Não N/A N/A Informa se empresa será habilitada para sempre mostrar volumes na DANFe
exibe_composicao_carga_mdfe booleano Não N/A N/A Informa se empresa será habilitada para mostrar composição da carga na MDFe
enviar_email_destinatario booleano Informa se empresa será habilitada para enviar email ao destinatário em produção
enviar_email_homologacao booleano Informa se empresa será habilitada para enviar email ao destinatário em homologação
discrimina_impostos booleano Informa se empresa será habilitada para discriminar impostos de NFe e NFCe
csc_nfce_producao texto N/A Sim N/A CSC para emissão de NFCe em ambiente de produção. Sem este campo não será possível emitir NFCe em produção. Veja com o SEFAZ do seu estado como gerar este código.
id_token_nfce_producao numérico N/A Sim N/A Id do CSC para emissão de NFCe em ambiente de produção. Sem este campo não será possível emitir NFCe em produção.Veja com o SEFAZ do seu estado como gerar este número.
csc_nfce_homologacao texto N/A N/A CSC para emissão de NFCe em ambiente de homologação. Sem este campo não será possível emitir NFCe em homologação.
id_token_nfce_homologacao numérico N/A Id do CSC para emissão de NFCe em ambiente dehomologação. Sem este campo não será possível emitir NFCe em homologação.
proximo_numero_nfe_producao numérico N/A N/A Próximo número da NFe a ser emitida em produção. Calculado automaticamente.
proximo_numero_nfe_homologacao numérico N/A N/A Próximo número da NFe a ser emitida em homologação. Calculado automaticamente.
serie_nfe_producao numérico N/A N/A Série da NFe a ser emitida em produção. Valor padrão: 1
serie_nfe_homologacao numérico N/A N/A Série da NFe a ser emitida em homologação. Valor padrão: 1
proximo_numero_nfce_producao numérico N/A N/A Próximo número da NFCe a ser emitida em produção. Calculado automaticamente.
proximo_numero_nfce_homologacao numérico N/A N/A Próximo número da NFCe a ser emitida em homologação. Calculado automaticamente.
serie_nfce_producao numérico N/A N/A Série da NFCe a ser emitida em produção. Valor padrão: 1
serie_nfce_homologacao numérico N/A N/A Série da NFCe a ser emitida em homologação. Valor padrão: 1
proximo_numero_nfse_producao numérico N/A N/A Próximo número do RPS da NFSe a ser emitida em produção. Calculado automaticamente.
proximo_numero_nfse_homologacao numérico N/A N/A Próximo número do RPS da NFSe a ser emitida em homologação. Calculado automaticamente.
serie_nfse_producao numérico N/A N/A Série do RPS para envio de NFSe em produção. Algumas prefeituras não utilizam.
serie_nfse_homologacao numérico N/A N/A Série do RPS em homologação.
proximo_numero_cte_producao numérico N/A N/A Próximo número da CTe a ser emitida em produção. Calculado automaticamente.
proximo_numero_cte_homologacao numérico N/A N/A Próximo número da CTe a ser emitida em homologação. Calculado automaticamente.
serie_cte_producao numérico N/A N/A Série da CTe a ser emitida em produção. Valor padrão: 1
serie_cte_homologacao numérico N/A N/A Série da CTe a ser emitida em homologação. Valor padrão: 1
proximo_numero_cte_os_producao numérico N/A N/A Próximo número da CTeOS a ser emitida em produção. Calculado automaticamente.
proximo_numero_cte_os_homologacao numérico N/A N/A Próximo número da CTeOS a ser emitida em homologação. Calculado automaticamente.
serie_cte_os_producao numérico N/A N/A Série da CTeOS a ser emitida em produção. Valor padrão: 1
serie_cte_os_homologacao numérico N/A N/A Série da CTeOS a ser emitida em homologação. Valor padrão: 1
proximo_numero_mdfe_producao numérico N/A N/A Próximo número da MDFe a ser emitida em produção. Calculado automaticamente.
proximo_numero_mdfe_homologacao numérico N/A N/A Próximo número da MDFe a ser emitida em homologação. Calculado automaticamente.
serie_mdfe_producao numérico N/A N/A Série da MDFe a ser emitida em produção. Valor padrão: 1
serie_mdfe_homologacao numérico N/A N/A Série da MDFe a ser emitida em homologação. Valor padrão: 1
arquivo_certificado_base64 texto em base 64 Sim Sim Sim* "Arquivo do certificado digital, em formato PFX ou P12, codificado em base64. Nem todas as prefeituras necessitam de certificado para emissão de NFSe."
senha_certificado texto Sim Sim Sim* Senha do certificado digital.
arquivo_logo_base64 texto em base 64 Logomarca da empresa para ser usada na DANFE. Nem todas as prefeituras aceitam o uso de logo. Utilize uma imagem em formato PNG de no máximo 200×200 pixels
nome_responsavel texto
cpf_responsavel texto
login_responsavel texto Login para acesso da prefeitura. Necessário para emissão de NFSe em alguns municípios que não utilizam certificado digital.
senha_responsavel texto Senha para acesso da prefeitura. Necessário para emissão de NFSe em alguns municípios que não utilizam certificado digital. Por motivos de segurança, este atributo não é exibido na consulta da empresa após ser salvo.
senha_responsavel_preenchida booleano Indica se o campo senha_responsavel está preenchido.
data_inicio_recebimento_nfe data Caso MDe esteja habilitado, permite especificar qual a data em que os documentos começarão ser recebidos. Documentos com datas anteriores serão ignorados e não serão cobrados. Se deixado em branco, serão buscados todos os documentos disponíveis. Uma vez definido, não poderá ser modificado.
smtp_endereco texto Endereço do servidor SMTP para envio de e-mails.
smtp_dominio texto Domínio do servidor SMTP para envio de e-mails. Se você precisa especificar um domínio HELO, você pode fazê-lo aqui.
smtp_autenticacao texto Tipo de autenticação do servidor SMTP para envio de e-mails. Se o seu servidor de e-mail exigir autenticação, você deve inserir o tipo de autenticação aqui. Valores possíveis: plain, login, cram_md5
smtp_porta numérico Porta do servidor SMTP para envio de e-mails.
smtp_login texto Login do servidor SMTP para envio de e-mails. Se o seu servidor de e-mail exigir autenticação, você deve inserir o nome de usuário aqui.
smtp_senha texto Senha do servidor SMTP para envio de e-mails. Se o seu servidor de e-mail exigir autenticação, você deve inserir a senha aqui.
smtp_remetente texto Remetente (from) dos e-mails enviados pelo servidor SMTP para envio de e-mails.
smtp_responder_para texto Responder para (reply to) dos e-mails enviados pelo servidor SMTP para envio de e-mails.
smtp_modo_verificacao_openssl texto Modo de verificação do servidor SMTP para envio de e-mails. Valores possíveis: peer, none
smtp_habilita_starttls booleano Utiliza o STARTTLS quando estiver conectado ao servidor SMTP para envio de e-mails.
smtp_ssl booleano Utiliza SSL quando estiver conectado ao servidor SMTP para envio de e-mails.
smtp_tls booleano Utiliza TLS quando estiver conectado ao servidor SMTP para envio de e-mails.

Status API

Aqui você encontra um resumo dos status possíveis para a API de empresas.

HTTP CODE/STATUS Status API Focus Descrição Correção
401 - unauthorized Verifique o seu token de acesso
404 - not found nao_encontrado Empresa não encontrada O id ou cnpj da empresa não foi encontrado
400 - bad request parametros_invalidos Existe um problema no JSON recebido Verifique o formato do arquivo JSON
422 - unprocessable entity erro_validacao Arquivo certificado base64 Houve um erro ao instalar o certificado, verifique se a senha está correto e o arquivo está no formato PFX ou P12 codificado em base64 Verifique se o certificado foi enviado corretamente
422 - unprocessable entity erro_validacao Arquivo certificado base64 Certificado não pertence ao CNPJ informado O certificado enviado não bate com o CNPJ informado
422 - unprocessable entity erro_validacao Arquivo certificado base64 Certificado com prazo de validade vencido Certificado precisa ser renovado

Criação de empresa

curl -u "token obtido no cadastro da empresa:" \
  -T empresa.json
  https://api.focusnfe.com.br/v2/empresas

Uma empresa pode ser criada usando o seguinte endereço

Exemplos de respostas da API por status para a requisição de envio:

sucesso

{
  "id": 17625,
  "nome": "Nome da empresa Ltda",
  "nome_fantasia": "Nome Fantasia",
  "inscricao_estadual": "1234",
  "inscricao_municipal": "46532",
  "bairro": "Vila Isabel",
  "cargo_responsavel": null,
  "cep": "80210000",
  "cnpj": "88776429000116",
  "cpf": null,
  "codigo_municipio": "4106902",
  "codigo_pais": "1058",
  "codigo_uf": "41",
  "complemento": "Loja 1",
  "cpf_cnpj_contabilidade": null,
  "cpf_responsavel": null,
  "discrimina_impostos": true,
  "email": "test@example.com",
  "enviar_email_destinatario": true,
  "habilita_nfce": false,
  "habilita_nfe": true,
  "habilita_nfse": false,
  "logradouro": "Rua João da Silva",
  "municipio": "Curitiba",
  "nome_responsavel": null,
  "numero": "153",
  "pais": "Brasil",
  "regime_tributario": "1",
  "telefone": "4130333333",
  "uf": "PR",
  "csc_nfce_producao": null,
  "id_token_nfce_producao": null,
  "csc_nfce_homologacao": null,
  "id_token_nfce_homologacao": null,
  "proximo_numero_nfe_producao": 1,
  "proximo_numero_nfe_homologacao": 1,
  "serie_nfe_producao": "1",
  "serie_nfe_homologacao": "1",
  "proximo_numero_nfse_producao": null,
  "proximo_numero_nfse_homologacao": null,
  "serie_nfse_producao": null,
  "serie_nfse_homologacao": null,
  "proximo_numero_nfce_producao": null,
  "proximo_numero_nfce_homologacao": null,
  "serie_nfce_producao": null,
  "serie_nfce_homologacao": null,
  "certificado_valido_ate": null,
  "certificado_valido_de": null,
  "certificado_cnpj": null,
  "data_ultima_emissao": null,
  "caminho_logo": null
}

erro_validacao (certificado inválido)

{
  "codigo": "erro_validacao",
  "mensagem": "Erro de validação",
  "erros": [
    {
      "codigo": "erro_validacao",
      "mensagem": "Arquivo certificado base64 Houve um erro ao instalar o certificado, verifique se a senha está correto e o arquivo está no formato PFX ou P12 codificado em base64",
      "campo": "arquivo_certificado_base64"
    }
  ]
}

erro_validacao (senha do certificado inválida)

{
  "codigo": "erro_validacao",
  "mensagem": "Erro de validação",
  "erros": [
    {
      "codigo": "erro_validacao",
      "mensagem": "Arquivo certificado base64 Certificado não pertence ao CNPJ informado",
      "campo": "arquivo_certificado_base64"
    }
  ]
}

erro_validacao (certificado de outra empresa)

{
  "codigo": "erro_validacao",
  "mensagem": "Erro de validação",
  "erros": [
    {
      "codigo": "erro_validacao",
      "mensagem": "Arquivo certificado base64 Certificado não pertence ao CNPJ informado",
      "campo": "arquivo_certificado_base64"
    }
  ]
}

erro_validacao (certificado vencido)

{
  "codigo": "erro_validacao",
  "mensagem": "Erro de validação",
  "erros": [
    {
      "codigo": "erro_validacao",
      "mensagem": "Arquivo certificado base64 Certificado com prazo de validade vencido",
      "campo": "arquivo_certificado_base64"
    }
  ]
}

https://api.focusnfe.com.br/v2/empresas

Caso queira apenas testar a criação de uma empresa, utilize o endereço abaixo:

https://api.focusnfe.com.br/v2/empresas?dry_run=1

Utilize o comando HTTP POST. O conteúdo do POST deverá conter os dados da empresa. O resultado será os dados da empresa criados ou uma mensagem de erro de validação. É importante salvar o campo id gerado para posterior consulta ou alteração da empresa. Considere o campo "id" como sendo alfanumérico, pois no futuro o formato deverá ser alterado para permitir letras e números na identificação.

Consulta de empresas

curl -u "token obtido no cadastro da empresa:" \
  https://api.focusnfe.com.br/v2/empresas/123

Exemplos de respostas da API por status para a requisição de envio:

sucesso

{
  "id": 17625,
  "nome": "Nome da empresa Ltda",
  "nome_fantasia": "Nome Fantasia",
  "inscricao_estadual": 1234,
  "inscricao_municipal": 46532,
  "bairro": "Vila Isabel",
  "cargo_responsavel": null,
  "cep": 80210000,
  "cnpj": "88776429000116",
  "cpf": null,
  "codigo_municipio": "4106902",
  "codigo_pais": "1058",
  "codigo_uf": "41",
  "complemento": "Loja 1",
  "cpf_cnpj_contabilidade": null,
  "cpf_responsavel": null,
  "discrimina_impostos": true,
  "email": "test@example.com",
  "enviar_email_destinatario": true,
  "habilita_nfce": false,
  "habilita_nfe": true,
  "habilita_nfse": false,
  "logradouro": "Rua João da Silva",
  "municipio": "Curitiba",
  "nome_responsavel": null,
  "numero": 153,
  "pais": "Brasil",
  "regime_tributario": 1,
  "telefone": "4130333333",
  "uf": "PR",
  "csc_nfce_producao": null,
  "id_token_nfce_producao": null,
  "csc_nfce_homologacao": null,
  "id_token_nfce_homologacao": null,
  "proximo_numero_nfe_producao": 1,
  "proximo_numero_nfe_homologacao": 1,
  "serie_nfe_producao": "1",
  "serie_nfe_homologacao": "1",
  "proximo_numero_nfse_producao": null,
  "proximo_numero_nfse_homologacao": null,
  "serie_nfse_producao": null,
  "serie_nfse_homologacao": null,
  "proximo_numero_nfce_producao": null,
  "proximo_numero_nfce_homologacao": null,
  "serie_nfce_producao": null,
  "serie_nfce_homologacao": null,
  "certificado_valido_ate": null,
  "certificado_valido_de": null,
  "certificado_cnpj": null,
  "data_ultima_emissao": null,
  "caminho_logo": null,
  "token_producao": null,
  "token_homologacao": null
}

nao_encontrado

{
  "codigo": "nao_encontrado",
  "mensagem": "Empresa não encontrada"
}

Uma empresa pode ser visualizada usando o seguinte endereço

https://api.focusnfe.com.br/v2/empresas/ID

Onde ID é o id da empresa fornecido no momento da criação. Utilize o comando HTTP GET. O resultado será todos os dados da empresa. Além dos campos utilizados para criação da empresa, a consulta retornará também os campos token_producao e token_homologacao que são gerados pela API para interações nos ambientes de produção e homologação.

Alteração de empresa

curl -X PUT -u "token obtido no cadastro da empresa:" \
  -T empresa.json
  https://api.focusnfe.com.br/v2/empresas/123

Exemplos de respostas da API por status para a requisição de envio:

sucesso

{
  "id": 17625,
  "nome": "Nome da empresa Ltda",
  "nome_fantasia": "Nome Fantasia",
  "inscricao_estadual": 1234,
  "inscricao_municipal": 46532,
  "bairro": "Vila Isabel",
  "cargo_responsavel": null,
  "cep": 80210000,
  "cnpj": "88776429000116",
  "cpf": null,
  "codigo_municipio": "4106902",
  "codigo_pais": "1058",
  "codigo_uf": "41",
  "complemento": "Loja 1",
  "cpf_cnpj_contabilidade": null,
  "cpf_responsavel": null,
  "discrimina_impostos": true,
  "email": "test@example.com",
  "enviar_email_destinatario": true,
  "habilita_nfce": false,
  "habilita_nfe": true,
  "habilita_nfse": false,
  "logradouro": "Rua João da Silva",
  "municipio": "Curitiba",
  "nome_responsavel": null,
  "numero": 153,
  "pais": "Brasil",
  "regime_tributario": 1,
  "telefone": "4130333333",
  "uf": "PR",
  "csc_nfce_producao": null,
  "id_token_nfce_producao": null,
  "csc_nfce_homologacao": null,
  "id_token_nfce_homologacao": null,
  "proximo_numero_nfe_producao": 1,
  "proximo_numero_nfe_homologacao": 1,
  "serie_nfe_producao": "1",
  "serie_nfe_homologacao": "1",
  "proximo_numero_nfse_producao": null,
  "proximo_numero_nfse_homologacao": null,
  "serie_nfse_producao": null,
  "serie_nfse_homologacao": null,
  "proximo_numero_nfce_producao": null,
  "proximo_numero_nfce_homologacao": null,
  "serie_nfce_producao": null,
  "serie_nfce_homologacao": null,
  "certificado_valido_ate": null,
  "certificado_valido_de": null,
  "certificado_cnpj": null,
  "data_ultima_emissao": null,
  "caminho_logo": null
}

erro_validacao (certificado inválido)

{
  "codigo": "erro_validacao",
  "mensagem": "Erro de validação",
  "erros": [
    {
      "codigo": "erro_validacao",
      "mensagem": "Arquivo certificado base64 Houve um erro ao instalar o certificado, verifique se a senha está correto e o arquivo está no formato PFX ou P12 codificado em base64",
      "campo": "arquivo_certificado_base64"
    }
  ]
}

erro_validacao (senha do certificado inválida)

{
  "codigo": "erro_validacao",
  "mensagem": "Erro de validação",
  "erros": [
    {
      "codigo": "erro_validacao",
      "mensagem": "Arquivo certificado base64 Certificado não pertence ao CNPJ informado",
      "campo": "arquivo_certificado_base64"
    }
  ]
}

erro_validacao (certificado de outra empresa)

{
  "codigo": "erro_validacao",
  "mensagem": "Erro de validação",
  "erros": [
    {
      "codigo": "erro_validacao",
      "mensagem": "Arquivo certificado base64 Certificado não pertence ao CNPJ informado",
      "campo": "arquivo_certificado_base64"
    }
  ]
}

erro_validacao (certificado vencido)

{
  "codigo": "erro_validacao",
  "mensagem": "Erro de validação",
  "erros": [
    {
      "codigo": "erro_validacao",
      "mensagem": "Arquivo certificado base64 Certificado com prazo de validade vencido",
      "campo": "arquivo_certificado_base64"
    }
  ]
}

Uma empresa pode ser alterada usando o seguinte endereço.

https://api.focusnfe.com.br/v2/empresas/ID

Caso queira apenas testar a alteração de uma empresa, utilize o endereço abaixo:

https://api.focusnfe.com.br/v2/empresas?dry_run=1

Onde ID é o id da empresa fornecido no momento da criação Utilize o comando HTTP PUT para alterar a empresa. O conteúdo do PUT deverá conter os dados da empresa que serão alterados. Os demais dados permanecerão inalterados. O resultado será todos os dados da empresa criados ou uma mensagem de erro de validação. Os dados devem seguir o mesmo formato para criação da empresa.

Atributos que não serão modificados podem ser omitidos.

Exclusão de empresa

curl -X DELETE -u "token obtido no cadastro da empresa:" \
  https://api.focusnfe.com.br/v2/empresas/123

Exemplos de respostas da API por status para a requisição de envio:

sucesso

{
  "id": 17625,
  "nome": "Nome da empresa Ltda",
  "nome_fantasia": "Nome Fantasia",
  "inscricao_estadual": 1234,
  "inscricao_municipal": 46532,
  "bairro": "Vila Isabel",
  "cargo_responsavel": null,
  "cep": 80210000,
  "cnpj": "88776429000116",
  "cpf": null,
  "codigo_municipio": "4106902",
  "codigo_pais": "1058",
  "codigo_uf": "41",
  "complemento": "Loja 1",
  "cpf_cnpj_contabilidade": null,
  "cpf_responsavel": null,
  "discrimina_impostos": true,
  "email": "test@example.com",
  "enviar_email_destinatario": true,
  "habilita_nfce": false,
  "habilita_nfe": true,
  "habilita_nfse": false,
  "logradouro": "Rua João da Silva",
  "municipio": "Curitiba",
  "nome_responsavel": null,
  "numero": 153,
  "pais": "Brasil",
  "regime_tributario": 1,
  "telefone": "4130333333",
  "uf": "PR",
  "csc_nfce_producao": null,
  "id_token_nfce_producao": null,
  "csc_nfce_homologacao": null,
  "id_token_nfce_homologacao": null,
  "proximo_numero_nfe_producao": 1,
  "proximo_numero_nfe_homologacao": 1,
  "serie_nfe_producao": "1",
  "serie_nfe_homologacao": "1",
  "proximo_numero_nfse_producao": null,
  "proximo_numero_nfse_homologacao": null,
  "serie_nfse_producao": null,
  "serie_nfse_homologacao": null,
  "proximo_numero_nfce_producao": null,
  "proximo_numero_nfce_homologacao": null,
  "serie_nfce_producao": null,
  "serie_nfce_homologacao": null,
  "certificado_valido_ate": null,
  "certificado_valido_de": null,
  "certificado_cnpj": null,
  "data_ultima_emissao": null,
  "caminho_logo": null
}

nao_encontrado

{
  "codigo": "nao_encontrado",
  "mensagem": "Empresa não encontrada"
}

permissao_negada (empresa não pertencente ao domínio do cliente)

{
  "codigo": "permissao_negada",
  "mensagem": "Empresa não encontrada como propriedade da revenda"
}

parametros_invalidos

{
  "erros": [
    {
      "codigo": "parametros_invalidos",
      "mensagem": "Existe um problema no JSON recebido: 822: unexpected token at 'empresa_id=12079'"
    }
  ]
}

Uma empresa pode ser cancelada usando o seguinte endereço

https://api.focusnfe.com.br/v2/empresas/ID

Onde ID é o id da empresa fornecido no momento da criação. Utilize o comando HTTP DELETE. O resultado será todos os dados da empresa excluída. Após esta operação você não terá mais acesso aos dados da empresa ou aos documentos emitidos. Esta operação não é reversível, mas você poderá cadastrar a empresa novamente no futuro se for necessário.

Listagem de empresas

curl -u "token obtido no cadastro da empresa:" \
  https://api.focusnfe.com.br/v2/empresas

É possível listar todas as empresas criadas usando o seguinte método HTTP:

https://api.focusnfe.com.br/v2/empresas

Utilize o comando HTTP GET. O resultado será todos os dados de todas a empresas.

Paginação

Ao fazer uma pesquisa, a API irá devolver o cabeçalho HTTP X-Total-Count que representa o número total de ocorrências da pesquisa, porém a API devolve apenas 50 registros por vez. Para buscar os demais registros, utilize o parâmetro offset. Exemplo:

Vamos supor que a chamada abaixo devolva 123 ocorrências:

https://api.focusnfe.com.br/v2/empresas

A segunda e terceira páginas da consulta poderão ser acessados desta forma:

Registros 51 a 100: https://api.focusnfe.com.br/v2/empresas?offset=50

Registros 101 a 123: https://api.focusnfe.com.br/v2/empresas?offset=100

Limite de requisições

A API é limitada a 100 créditos/minuto por token de acesso. Cada requisição consome 1 crédito. Isto é válido para requisições de qualquer documento fiscal, para qualquer método. Todas as respostas da API incluem os cabeçalhos abaixo, que descrevem os limites atuais da sua aplicação:

Se o limite é atingido, é devolvido o código status HTTP 429 (Too many requests) e sua aplicação deverá aguardar o término do período (Rate-Limit-Reset) para poder fazer novas requisições.

Bibliotecas Externas

Abaixo disponibilizamos as bibliotecas criadas por nós ou por nossos usuários. Caso tenha criado uma biblioteca e possa compartilha-la entre em contato conosco para a disponibilizarmos aqui.

Java

https://github.com/frekele/focusnfe-api-client Biblioteca que contempla as APIs de NFe, NFCe, Manifestação, NCM e suporte a gatilhos. Biblioteca criada e gentilmente disponiblizada através da licença MIT por @frekele (Leandro Kersting de Freitas).

Exemplos GitHub

Você pode consultar exemplos de código nos seguintes repositórios:

Exemplos
no Postman