NAV Navbar
shell php java ruby python javascript
  • Introdução
  • NFe
  • NFCe
  • CTe e CTe OS (beta)
  • Backups (NFe, NFCe e CTe)
  • NFSe
  • Manifestação
  • Gatilhos / Webhooks
  • Consulta de NCM
  • Consulta de CFOP
  • Revenda
  • Limite de requisições
  • Bibliotecas externas
  • Códigos de exemplo no GitHub
  • Introdução

    A API do Focus NFe permite que você emita ou consulte documentos fiscais (NFe, NFSe, NFCe) a partir do seu sistema, seja qual for a tecnologia que ele utilize através da geração de dados em um formato simplificado, sem a necessidade de gerara a assinatura digital destes documentos. A API ainda gerencia toda a comunicação com os servidores da SEFAZ de cada estado ou com os servidores da prefeitura, no caso de NFSe.

    Através desta documentação deverá ser possível fazer a integração com a API do Focus NFe, caso alguma dúvida permaneça você pode entrar em contato com o suporte especializado através do e-mail suporte@acras.com.br.

    Como ler este documento?

    Você deverá ler primeiramente a introdução, em seguida, a seção sobre o documento que você irá emitir (NFe, NFCe ou NFSe).

    Caso você emita NFe ou NFCe, você deverá ler também sobre os backups.

    Caso você emita NFe ou NFSe, você poderá ler também sobre os gatilhos. O uso de gatilhos no sistema é opcional.

    Caso você tenha interesse em obter as notas emitidas contra a sua empresa, leia a seção de manifestação.

    Se sua empresa irá administrar vários clientes que emitem notas, pode ser interessante você ler sobre a seção de revenda.

    Qual documento fiscal você precisa emitir?

    Dependendo da atividade da sua empresa você deverá emitir um ou mais destes documentos que irão representar frente ao governo qualquer operação com mercadoria ou serviços:

    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. 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: http://homologacao.acrasnfe.acras.com.br (note que não é utilizado SSL).

    Produção: https://api.focusnfe.com.br (obrigatório o uso de SSL).

    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 em produção. Pode ser necessário indicar explicitamente a confiar na autoridade certificadora que emitiu o certificado SSL.

    Você pode baixar a cadeia de certificados aqui

    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

    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",
      "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 – à vista;

    1 – à prazo;

    2 – outros.

    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

    Envio

    # arquivo.json deve conter os dados da NFe
    curl -u token_enviado_pelo_suporte: \
      -X POST -T arquivo.json http://homologacao.acrasnfe.acras.com.br/v2/nfe
    
    <?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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $ref = "12345";
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfe"
    
    # Substituir pela sua identificação interna da nota
    ref = {"ref":"12345"}
    
    token="token_enviado_pelo_suporte"
    
    '''
    Usamos dicionarios para armazenar os campos e valores que em seguida,
    serao convertidos em JSON e enviados para nossa API
    '''
    nfe = {}
    itens = {}
    notas_referenciadas ={}
    
    nfe["natureza_operacao"] = "Venda"
    nfe["forma_pagamento"] = "0"
    nfe["data_emissao"] = "2018-03-07T10:20:00-03:00"
    nfe["tipo_documento"] = "0"
    nfe["local_destino"] = "1"
    nfe["finalidade_emissao"] = "4"
    nfe["consumidor_final"] = "0"
    nfe["presenca_comprador"] = "9"
    nfe["cnpj_emitente"] = "99999999999999"
    nfe["logradouro_emitente"] = "R. Padre Pigato"
    nfe["numero_emitente"] = "9236"
    nfe["bairro_emitente"] = "Santa Gula"
    nfe["municipio_emitente"] = "Curitiba"
    nfe["uf_emitente"] = "PR"
    nfe["cep_emitente"] = "82320999"
    nfe["telefone_emitente"] = "4199999999"
    nfe["inscricao_estadual_emitente"] = "999999999"
    nfe["regime_tributario_emitente"] = "1"
    nfe["cpf_destinatario"] = "99999999999"
    nfe["nome_destinatario"] = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"
    nfe["logradouro_destinatario"] = "Rua Prof. Yolanda Romeu Lugarini"
    nfe["numero_destinatario"] = "1"
    nfe["bairro_destinatario"] = "JD SANTA CECILIA"
    nfe["municipio_destinatario"] = "CAMPO MAGRO"
    nfe["uf_destinatario"] = "PR"
    nfe["cep_destinatario"] = "83000000"
    nfe["indicador_inscricao_estadual_destinatario"] = "2"
    nfe["icms_base_calculo"] = "0"
    nfe["icms_valor_total"] = "0"
    nfe["icms_valor_total_desonerado"] = "0"
    nfe["icms_base_calculo_st"] = "0"
    nfe["icms_valor_total_st"] = "0"
    nfe["valor_produtos"] = "1.00"
    nfe["valor_frete"] = "0"
    nfe["valor_seguro"] = "0"
    nfe["valor_desconto"] = "0"
    nfe["valor_total_ii"] = "0"
    nfe["valor_ipi"] = "0"
    nfe["valor_pis"] = "0"
    nfe["valor_cofins"] = "0"
    nfe["valor_outras_despesas"] = "0"
    nfe["valor_total"] = "1.00"
    nfe["modalidade_frete"] = "0"
    notas_referenciadas["chave_nfe"] = 41170599999999999999550020000001111337477298
    itens["numero_item"] = "1"
    itens["codigo_produto"] = "ESSP"
    itens["descricao"] = "Carrinho de corrida"
    itens["cfop"] = "1202"
    itens["unidade_comercial"] = "UN"
    itens["quantidade_comercial"] = "1.00"
    itens["valor_unitario_comercial"] = "1.00"
    itens["valor_bruto"] = "1.00"
    itens["valor_desconto"] = "0"
    itens["unidade_tributavel"] = "UN"
    itens["codigo_ncm"] = "49119900"
    itens["quantidade_tributavel"] = "1.00"
    itens["valor_unitario_tributavel"] = "1.00"
    itens["inclui_no_total"] = "1"
    itens["icms_origem"] = "0"
    itens["icms_situacao_tributaria"] = "103"
    itens["pis_situacao_tributaria"] = "99"
    itens["cofins_situacao_tributaria"] = "99"
    
    # Adicionamos os dados das variaveis itens e notas_referenciadas como listas ao dicionario principal.
    nfe["items"] = [itens]
    nfe["notas_referenciadas"] = [notas_referenciadas]
    
    r = requests.post(url, params=ref, data=json.dumps(nfe), auth=(token,""))
    
    # Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
    print(r.status_code, r.text)
    

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

    Envia uma NFe para autorização:

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

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

    Nesta etapa, é feita uma primeira validação dos dados da nota. Caso ocorra algum problema, por exemplo, algum campo faltante, formato incorreto ou algum problema com o emitente a nota não será aceita para processamento e será devolvida a mensagem de erro apropriada. Veja a seção erros.

    Caso a nota seja validada corretamente, a nota será aceita para processamento. Isto significa que a nota irá para uma fila de processamento onde eventualmente será processada (processamento assíncrono). Com isto, a nota poderá ser autorizada ou ocorrer um erro na autorização, de acordo com a validação da SEFAZ.

    Para verificar se a nota já foi autorizada, você terá que efetuar uma consulta ou se utilizar de gatilhos.

    Reenvio automático em contingência

    Caso nossa equipe de monitoramento detecte que o SEFAZ de algum estado esteja fora do ar as requisições são redirecionadas para o ambiente de contingência da SEFAZ do estado. É natural haver uma demora na SEFAZ em disponibilizar esse ambiente (eles realizam este processo manualmente) porém nossa API irá continuar tentando o reenvio até que seja possível, seja pela emissão normal ou em contingência. Isto é feito de forma transparente aos clientes da API.

    Porém, pode ocorrer uma situação em que o SEFAZ do estado fique indisponível no meio do processo de emissão de uma NFe. Neste momento nós não temos como saber se a nota foi autorizada ou não, até que a SEFAZ volte a ficar disponível.

    Quando isto ocorre nós não esperamos a SEFAZ do estado voltar e reenviamos assim que possível para o ambiente de contingência, autorizando a nota e evitando a espera para o cliente final. Isto tem como efeito colateral que pode ser que a nota original tenha sido autorizada. Nossa API irá automaticamente detectar esta situação e proceder com o cancelamento da tentativa anterior. Por consequência, será natural haver um “pulo” de numeração percebido pelo cliente final.

    O sistema cliente da API pode acompanhar este processo de forma transparente, conforme descrito na seção “Consulta” deste manual.

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfe/"
    
    # Substituir pela sua identificação interna da nota
    ref = "12345"
    
    token="token_enviado_pelo_suporte"
    
    # 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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $ref = "12345";
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/"
    
    # no caso do ambiente de envio ser em produção, utilizar servidor_producao
    url_envio = servidor_homologacao + "v2/nfe/" + ref
    
    # 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
    
    
    
    /*
    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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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 da consulta de NFe:

    {
      "cnpj_emitente": "CNPJ_DO_EMITENTE",
      "ref": "REFERENCIA",
      "status": "cancelado",
      "status_sefaz": "135",
      "mensagem_sefaz": "Evento registrado e vinculado a NF-e",
      "numero": "25",
      "serie": "3",
      "chave_nfe": "NFe91180177643353000172550030000000251381549464",
      "caminho_xml_nota_fiscal": "/arquivos_development/77623353000000/201201/XMLs/91180177643353000172550030000000251381549464-nfe.xml",
      "caminho_xml_cancelamento": "/arquivos_development/77623353000000/201201/XMLs/91180177643353000172550030000000251381549464-can.xml",
      "caminho_xml_carta_correcao": "/arquivos_development/77623353000000/201201/XMLs/91180177643353000172550030000000251381549464-cce-01.xml",
      "caminho_pdf_carta_correcao": "/notas_fiscais/NFe91180177643353000172550030000000251381549464/cartas_correcao/1.pdf",
      "numero_carta_correcao": 1
    }
    

    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:

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

    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:

    Cancelamento

    curl -u token_enviado_pelo_suporte: \
      -X DELETE -d '{"justificativa":"Teste de cancelamento de nota"}' \
      http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $ref = "12345";
    $login = "token_enviado_pelo_suporte";
    $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);
    $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 NFeCancelamento {
    
        public static void main(String[] args){
    
            String login = "Token_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfe/"
    
    # Substituir pela sua identificação interna da nota
    ref = "12345"
    
    token="token_enviado_pelo_suporte"
    
    '''
    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)
    

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

    {
      "status_sefaz": "135",
      "mensagem_sefaz": "Evento registrado e vinculado a NF-e",
      "status": "cancelado",
      "caminho_xml_cancelamento": "/arquivos_development/77993353000000/204703/XMLs/41180377993353000000000030000000885414063742-can.xml"
    }
    

    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âmetros de cancelamento deverão ser enviados 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.

    Carta de Correção Eletrônica

    curl -u token_enviado_pelo_suporte: \
      -X POST -d '{"correcao":"Teste de carta de correcao"}' \
      http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $ref = "12345";
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 = {  
      campo_correcao: "Informe aqui os campos que foram corrigidos na NFe."
    }
    
    # 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 = 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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfe/"
    
    # Substituir pela sua identificação interna da nota
    ref = "12345"
    
    token="token_enviado_pelo_suporte"
    
    '''
    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)
    

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

    {
      "status_sefaz": "135",
      "mensagem_sefaz": "Evento registrado e vinculado a NF-e",
      "status": "autorizado",
      "caminho_xml_carta_correcao": "/arquivos_development/77793353000000/201803/XMLs/99180377993353000000550030000000271021711350-cce-01.xml",
      "caminho_pdf_carta_correcao": "/notas_fiscais/NFe411803777933530000002550030000000277771711350/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_enviado_pelo_suporte: \
      -X POST -d '{"emails":["alguem@example.org"]}' \
      http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $ref = "12345";
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.com.br/";
    
            String url = server.concat("v2/nfe/"+ref+"/email");
    
            /* Criamos o um objeto JSON que receberá um JSON Array com a lista de e-mails. */
            JSONObject json = new JSONObject ();
            JSONArray listaEmails = new JSONArray();
            listaEmails.put("email_01@acras.com.br");
            listaEmails.put("email_02@acras.com.br");
            listaEmails.put("email_03@acras.com.br");
            json.put("emails", listaEmails);
    
            /* Testar se o JSON gerado está dentro do formato esperado.
            System.out.print(json); */
    
            /* Configuração para realizar o HTTP BasicAuth. */
            Object config = new DefaultClientConfig();
            Client client = Client.create((ClientConfig) config);
            client.addFilter(new HTTPBasicAuthFilter(login, ""));
    
            WebResource request = client.resource(url);
    
            ClientResponse resposta = request.post(ClientResponse.class, json);
    
            int httpCode = resposta.getStatus();
    
            String body = resposta.getEntity(String.class);
    
            /* As três linhas abaixo imprimem as informações retornadas pela API.
             * Aqui o seu sistema deverá interpretar e lidar com o retorno. */
            System.out.print("HTTP Code: ");
            System.out.print(httpCode);
            System.out.printf(body);
        }
    }
    
    
    # encoding: UTF-8
    
    require "net/http"
    require "net/https"
    require "json"
    
    # token enviado pelo suporte
    token = "codigo_alfanumerico_token"
    
    # referência da nota - deve ser única para cada nota enviada
    ref = "id_referencia_nota"
    
    # endereço da api que deve ser usado conforme o ambiente: produção ou homologação
    servidor_producao = "https://api.focusnfe.com.br/"
    servidor_homologacao = "http://homologacao.acrasnfe.acras.com.br/"
    
    # no caso do ambiente de envio ser em produção, utilizar servidor_producao
    url_envio = servidor_homologacao + "v2/nfe/" + ref + "/email"
    
    # altere os campos conforme a nota que será enviada
    emails_destinatarios = {
      emails: ["email_01@acras.com.br", "email_02@acras.com.br", "email_03@acras.com.br"]
    }
    
    # criamos 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 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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfe/" + ref + "/email";
    
    /*
    Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
    Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
    */
    request.open('POST', url, false, token);
    
    var email = ["email1@acras.com.br", "email2@acras.com.br", "email3@acras.com.br"];
    
    // Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
    var json = JSON.stringify({"emails": email});
    
    request.send(json);
    
    // Sua aplicacao tera que ser capaz de tratar as respostas da API.
    console.log("HTTP code: " + request.status);
    console.log("Corpo: " + request.responseText);
    
    
    # Faça o download e instalação da biblioteca requests, através do python-pip.
    import json
    import requests
    
    '''
    Para ambiente de produção use a variável abaixo:
    url = "https://api.focusnfe.com.br"
    '''
    url = "http://homologacao.acrasnfe.acras.com.br/v2/nfe/"
    
    # Substituir pela sua identificação interna da nota
    ref = "12345"
    
    token="token_enviado_pelo_suporte"
    
    '''
    Usamos um dicionario para armazenar os campos e valores que em seguida,
    serao convertidos a JSON e enviados para nossa API
    '''
    emails = {}
    email = "suporte@acras.com.br"
    emails["emails"] = [email]
    
    r = requests.delete(url+ref+"/email", data=json.dumps(emails), auth=(token,""))
    
    # Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
    print(r.status_code, r.text)
    

    Para cada nota autorizada, cancelada ou que tenha sido emitida uma carta de correção o destinatário da nota é notificado via email. Porém eventualmente pode ser necessário enviar a nota fiscal para outras pessoas ou mesmo reenviar o email para o mesmo destinatário.

    Para enviar um ou mais emails:

    https://api.focusnfe.com.br/v2/nfe/REFERENCIA/email

    Utilize o comando HTTP POST para enviar os emails. Esta operação aceita apenas um parâmetro:

    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_enviado_pelo_suporte: \
      -X POST -d '{"cnpj":"51916585000125","serie":"1","numero_inicial":"7","numero_final":"9","justificativa":"Teste de inutilizacao de nota"}' \
      http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
            /* Para ambiente de produção use a variável abaixo:
            String server = "https://api.focusnfe.com.br/"; */
            String server = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 = 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_enviado_pelo_suporte";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfe/inutilizacao"
    
    token="token_enviado_pelo_suporte"
    
    '''
    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)
    

    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": "/arquivos_development/71113353000900/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 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:

    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 =http://producao.acrasnfe.acras.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 (http://homologacao.acrasnfe.acras.com.br) e produção (http://producao.acrasnfe.acras.com.br).

    O token é a chave de acesso, fornecida pelo suporte, que irá garantir que a aplicação do cliente tem acesso ao Focus NFe.

    Download

    O comunicador foi desenvolvido para uso em sistema operacional Windows, para fazer o download do comunicador clique aqui .

    NFCe

    Através da API NFCe é possível:

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

    Geral

    Campo Tipo Obrigatório Descrição Validação
    natureza_operacao texto sim Descrição da natureza de operação. Caso não informado, será utilizado o texto “VENDA AO CONSUMIDOR”.
    data_emissao data e hora sim Data e hora de emissão com timezone. Utilize o formato ISO, exemplo 2015-11-19T13:54:31-02:00. Diferença máxima permitida de 5 minutos do horário atual.
    presenca_comprador numérico sim Presença do comprador.Valores possíveis:1 – Operação presencial.4 – Entrega a domicílio.
    informacoes_adicionais _contribuinte texto não Informações adicionais.
    cnpj_emitente texto sim CNPJ da empresa que está emitindo a NFCe. CNPJ válido.

    Destinatário

    Campo Tipo Obrigatório Descrição Validação
    nome_destinatario texto não Nome do consumidor.
    cnpj_destinatario texto não CNPJ do consumidor. Enviar em branco ou documento válido.
    cpf_destinatario texto não CPF do consumidor. Enviar em branco ou documento válido.
    telefone_destinatario texto não Telefone do consumidor.
    logradouro_destinatario texto não Logradouro do consumidor.
    numero_destinatario texto não Número do endereço do consumidor.
    bairro_destinatario texto não Bairro do consumidor.
    municipio_destinatario texto não Município do consumidor.
    uf_destinatario texto não Sigla da UF do consumidor.
    cep_destinatario texto não CEP do consumidor.

    Itens

    Os dados dos itens da NFCe devem ser enviados dentro de um Array JSON. O nome que este array deve ter é “itens“.

    Campo Tipo Obrigatório Descrição
    numero_item numérico sim Número do item. Comece com 1 e aumente sequencialmente para cada item da NFCe.
    codigo_ncm texto sim Código NCM do produto (8 dígitos).
    codigo_produto texto sim Código do produto.
    descricao texto sim Descrição do produto.
    quantidade_comercial numérico sim Quantidade do item.
    quantidade_tributavel numérico sim Quantidade tributável do item. Caso não se aplique utilize o mesmo valor de quantidade_comercial.
    cfop texto sim Código Fiscal da operação. Utilize algum CFOP da operação válido para Nota ao Consumidor.
    valor_unitario_comercial numérico sim Valor unitário do item.
    valor_unitario_tributavel numérico sim Valor unitário tributável do item. Caso não se aplique utilize o mesmo valor que valor_unitario_comercial.
    valor_bruto numérico sim Valor bruto do item. Calculado como valor_unitario_comercial * quantidade_comercial
    unidade_comercial texto sim Unidade comercial do produto. Você pode utilizar valores como “KG”, “L”, “UN”, etc. Caso não se aplique utilize “UN”.
    unidade_tributavel texto sim Unidade tributável do produto. Caso não se aplique utilize o mesmo valor do campo unidade_comercial.
    icms_origem valor da lista sim Valores Possíveis: 0: nacional. 1: estrangeira (importação direta). 2: estrangeira (adquirida no mercado interno). 3: nacional com mais de 40% de conteúdo estrangeiro. 4: nacional produzida através de processos produtivos básicos. 5: nacional com menos de 40% de conteúdo estrangeiro. 6: estrangeira (importação direta) sem produto nacional similar. 7: estrangeira (adquirida no mercado interno) sem produto nacional similar.
    icms_situacao_tributaria valor da lista sim Valores possíveis: Para empresas optantes do SIMPLES: 102 – Tributada pelo Simples Nacional sem permissão de crédito, 300 - Imune, 500 - CMS cobrado anteriormente por substituição tributária (substituído) ou por antecipação. Para empresas não optantes do SIMPLES: 00 – tributada integralmente, 40 – Isenta, 41 - Não tributada, 60 - ICMS cobrado anteriormente por substituição tributária
    icms_aliquota numérico Obrigatório se icms_situacao_tributaria = 00 Alíquota do ICMS. Deve estar entre 0 e 100.
    icms_base_calculo numérico Obrigatório se icms_situacao_tributaria = 00 Base de cálculo do ICMS. Normalmente é igual ao valor_bruto.
    icms_modalidade_base _calculo valor da lista Obrigatório se icms_situacao_tributaria = 00 Modalidade da base de cálculo do ICMS.Valores possíveis:0 – margem de valor agregado (%).1 – pauta (valor).2 – preço tabelado máximo (valor).3 – valor da operação.
    valor_desconto numérico Valor do desconto do item.
    valor_frete numérico Valor do frete do item. Usado apenas se entrega a domicílio. O frete deve ser “rateado” entre todos os itens.

    Transportador

    Campo Tipo Obrigatório Descrição
    cnpj_transportador string sim se presenca_comprador = 4 CNPJ do transportador. Se este campo for informado não deverá ser informado cpf_transportador.
    cpf_transportador string sim se presenca_comprador = 4 CPF do transportador. Se este campo for informado não deverá ser informado cnpj_transportador.
    nome_transportador string sim se presenca_comprador = 4 Nome ou razão social do transportador.
    inscricao_estadual_transportador string sim se presenca_comprador = 4 Inscrição Estadual do transportador.
    endereco_transportador string sim se presenca_comprador = 4 Endereço (logradouro, número, complemento e bairro) do transportador.
    municipio_transportador string sim se presenca_comprador = 4 Município do transportador.
    uf_transportador string sim se presenca_comprador = 4 UF do transportador.

    Pagamento

    Os dados abaixo devem ser enviados dentro de um Array JSON. O nome que este array deve ter é “formas_pagamento“.

    Campo Tipo Obrigatório Descrição
    forma_pagamento valor da lista sim Forma do recebimento. Valores possíveis:01: Dinheiro.02: Cheque.03: Cartão de Crédito.04: Cartão de Débito.05: Crédito Loja.10: Vale Alimentação.11: Vale Refeição.12: Vale Presente.13: Vale Combustível.99: Outros
    valor_pagamento numérico sim Valor do recebimento.
    tipo_integracao valor da lista não Tipo de Integração para pagamento. Valores possíveis:1: Pagamento integrado com o sistema de automação da empresa (Ex.: equipamento TEF, Comércio Eletrônico) – Obrigatório informar cnpj_credenciadora e numero_autorizacao.2: Pagamento não integrado com o sistema de automação da empresa (valor padrão). Informar apenas se forma_pagamento for 03 ou 04.
    cnpj_credenciadora numérico Obrigatório se tipo_integracao for 1 CNPJ da credenciadora do cartão de crédito. Somente CNPJ válido.
    numero_autorizacao string Obrigatório se tipo_integracao for 1
    bandeira_operadora string Obrigatório se forma_pagamento = 03 ou 04 (pagamento em cartão) Bandeira da operadora de cartão de crédito e/ou débito. Valores possíveis:01: Visa.02: Mastercard.03: American Express.04: Sorocred.99: Outros.

    Totalizadores

    Campos Tipo Obrigatório Descrição
    valor_produtos numérico não Valor total dos produtos. Calculado automaticamente se não informado.
    valor_desconto numérico não Valor total dos descontos. Calculado automaticamente se não informado.
    valor_total numérico não Valor líquido dos produtos. Deve ser igual a valor_produtos – valor_desconto. Calculado automaticamente se não informado.
    valor_frete numérico não Valor total do frete. Deve conter o somatório do valor do frete dos itens (usado apenas em entrega a domicílio). Calculado automaticamente se não informado.
    icms_valor_total numérico não Valor total de ICMS dos produtos. Deve ser o somatório dos valores contidos em icms_valor nos items. Calculado automaticamente se não informado.
    icms_base_calculo numérico sim, se algum item tem icms_situacao_tributaria = 00 Valor total da base de cálculo do ICMS dos produtos. Deve ser o somatório dos valores contidos em icms_base_calculo nos items. Calculado automaticamente se não informado.

    Campos calculados automaticamente

    Para simplificar o envio da nota fiscal, alguns campos são calculados automaticamente a partir da versão 4.00 da NFCe. Os campos calculados são somatórios de campos fornecidos nos itens da nota fiscal. Os campos serão calculados apenas se eles não forem informados na API.

    A lista de campos calculados automaticamente segue abaixo:

    Campo Somatório de campo dos itens Observação
    icms_base_calculo icms_base_calculo
    valor_ipi ipi_valor
    icms_valor_total_st icms_valor_st
    issqn_base_calculo issqn_base_calculo
    issqn_valor_total issqn_valor
    issqn_valor_total_deducao issqn_valor_deducao
    issqn_valor_total_outras_retencoes issqn_valor_outras_retencoes
    issqn_valor_total_desconto_incondicionado issqn_valor_desconto_incondicionado
    issqn_valor_total_desconto_condicionado issqn_valor_desconto_condicionado
    issqn_valor_total_retencao issqn_valor_retencao
    issqn_base_calculo issqn_base_calculo
    valor_total_ii ii_valor
    fcp_valor_total fcp_valor
    fcp_valor_total_uf_destino fcp_valor_uf_destino
    fcp_valor_total_st fcp_valor_st
    fcp_valor_total_retido_st fcp_valor_retido_st
    icms_valor_total_uf_destino icms_valor_uf_destino
    icms_valor_total_uf_remetente icms_valor_uf_remetente
    icms_base_calculo icms_base_calculo
    icms_valor_total icms_valor
    icms_valor_total_desonerado icms_valor_desonerado
    icms_base_calculo_st icms_base_calculo_st
    icms_valor_total_st icms_valor_st
    valor_frete valor_frete
    valor_seguro valor_seguro
    valor_outras_despesas valor_outras_despesas
    valor_desconto valor_desconto
    valor_ipi_devolvido valor_ipi_devolvido
    valor_total_tributos valor_total_tributos
    valor_produtos valor_bruto Apenas se inclui_no_total=1
    valor_total_servicos valor_bruto Apenas se inclui_no_total=1 e item de serviço
    icms_valor_total icms_valor Apenas se icms_situacao_tributaria diferente de40, 41 e 50.
    valor_pis_servicos pis_valor Apenas se item de serviço
    valor_cofins_servicos cofins_valor Apenas se item de serviço
    valor_pis pis_valor Apenas se não for item de serviço
    valor_cofins cofins_valor Apenas se não for item de serviço

    Além disso, caso não seja fornecido, será calculado também o valor total da NFCe (valor_total), calculado da seguinte forma:

    valor_produtos – valor_desconto – icms_valor_total_desonerado + icms_valor_total_st + valor_frete + valor_seguro + valor_outras_despesas + valor_total_ii + valor_ipi + valor_total_servicos

    Além dos campos acima, os campos abaixo são preenchidos automaticament para NFCe, pois tem apenas um conteúdo válido possível:

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfce"
    
    # Substituir pela sua identificação interna da nota
    ref = {"ref":"1234"}
    
    token="token_enviado_pelo_suporte"
    
    '''
    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_enviado_pelo_suporte: \
      -X POST -T arquivo.json http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $ref = "12345";
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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.

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfce/"
    
    # Substituir pela sua identificação interna da nota
    ref = "1234"
    
    token="token_enviado_pelo_suporte"
    
    # 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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/"
    
    # no caso do ambiente de envio ser em produção, utilizar servidor_producao
    url_envio = servidor_homologacao + "v2/nfce/" + ref
    
    # 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
    /* 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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $ref = "12345";
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfce/" + ref + "?completa=1";
    
    /*
    Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
    Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
    */
    request.open('GET', url, false, token);
    
    request.send();
    
    // Sua aplicacao tera que ser capaz de tratar as respostas da API.
    console.log("HTTP code: " + request.status);
    console.log("Corpo: " + request.responseText);
    
    

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

    Consultar as informações de uma NFCe:

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

    Utilize o comando HTTP GET para consultar a sua nota para nossa API.

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

    Exemplo de resposta da consulta de NFCe (completa=0):

    {
    "status":"autorizado",
    "status_sefaz":"100",
    "mensagem_sefaz":"Autorizado o uso da NF-e",
    "cnpj_emitente":"SEU_CNPJ",
    "ref":"REFERENCIA",
    "chave_nfe":"NFe41170777627353999172550010000003871980884091",
    "numero":"387",
    "serie":"1",
    "caminho_xml_nota_fiscal":"/arquivos/733530172/201704/XMLs/41170777627353999172550010000003871980884091-nfe.xml",
    "caminho_danfe":"/arquivos/733530172/201704/DANFEs/41170777627353999172550010000003871980884091.pdf"
    }
    

    Campos de retorno:

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

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfce/"
    
    # Substituir pela sua identificação interna da nota
    ref = "12345"
    
    token="token_enviado_pelo_suporte"
    
    '''
    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_enviado_pelo_suporte: \
      -X DELETE -d '{"justificativa":"Teste de cancelamento de nota"}' \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $ref = "12345";
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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âmetros de cancelamento deverão ser enviados da seguinte forma:

    A API irá em seguida devolver os seguintes campos:

    Prazo de cancelamento

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

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfce/inutilizacao"
    
    token="token_enviado_pelo_suporte"
    
    '''
    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_enviado_pelo_suporte: \
      -X POST -d '{"cnpj":"51916585009999","serie":"9","numero_inicial":"7730","numero_final":"7732","justificativa":"Teste de inutilizacao de nota"}' \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* Para ambiente de produção use a variável abaixo:
            String server = "https://api.focusnfe.com.br/"; */
            String server = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 = 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 = "http://homologacao.acrasnfe.acras.com.br";
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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:

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfce/"
    
    # Substituir pela sua identificação interna da nota
    ref = "12345"
    
    token="token_enviado_pelo_suporte"
    
    '''
    Usamos um dicionario para armazenar os campos e valores que em seguida,
    serao convertidos a JSON e enviados para nossa API
    '''
    emails = {}
    email = "suporte@acras.com.br"
    emails["emails"] = [email]
    
    r = requests.delete(url+ref+"/email", data=json.dumps(emails), auth=(token,""))
    
    # Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
    print(r.status_code, r.text)l
    
    
    curl -u token_enviado_pelo_suporte: \
      -X POST -d '{"emails":["alguem@example.org"]}' \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.com.br/";
    
            String url = server.concat("v2/nfce/"+ref+"/email");
    
            /* Criamos o um objeto JSON que receberá um JSON Array com a lista de e-mails. */
            JSONObject json = new JSONObject ();    
            JSONArray listaEmails = new JSONArray();
            listaEmails.put("email_01@acras.com.br");
            listaEmails.put("email_02@acras.com.br");
            listaEmails.put("email_03@acras.com.br");
            json.put("emails", listaEmails);    
    
            /* Testar se o JSON gerado está dentro do formato esperado.
            System.out.print(json); */
    
            /* Configuração para realizar o HTTP BasicAuth. */
            Object config = new DefaultClientConfig();
            Client client = Client.create((ClientConfig) config);
            client.addFilter(new HTTPBasicAuthFilter(login, ""));
    
            WebResource request = client.resource(url);
    
            ClientResponse resposta = request.post(ClientResponse.class, json);
    
            int httpCode = resposta.getStatus(); 
    
            String body = resposta.getEntity(String.class);
    
            /* As três linhas abaixo imprimem as informações retornadas pela API. 
             * Aqui o seu sistema deverá interpretar e lidar com o retorno. */
            System.out.print("HTTP Code: ");
            System.out.print(httpCode);
            System.out.printf(body); 
        }
    }
    
    
    # encoding: UTF-8
    
    require "net/http"
    require "net/https"
    require "json"
    
    # token enviado pelo suporte
    token = "codigo_alfanumerico_token"
    
    # referência da nota - deve ser única para cada nota enviada
    ref = "id_referencia_nota"
    
    # endereço da api que deve ser usado conforme o ambiente: produção ou homologação
    servidor_producao = "https://api.focusnfe.com.br/"
    servidor_homologacao = "http://homologacao.acrasnfe.acras.com.br/"
    
    # no caso do ambiente de envio ser em produção, utilizar servidor_producao
    url_envio = servidor_homologacao + "v2/nfce/" + ref + "/email"
    
    # altere os campos conforme a nota que será enviada
    emails_destinatarios = {
      emails: ["email_01@acras.com.br", "email_02@acras.com.br", "email_03@acras.com.br"]
    }
    # criamos 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 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 = "http://homologacao.acrasnfe.acras.com.br";
    // Substituir a variável, ref, pela sua identificação interna de nota.
    $ref = "12345";
    $login = "token_enviado_pelo_suporte";
    $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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfce/" + ref + "/email";
    
    /*
    Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
    Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
    */
    request.open('POST', url, false, token);
    
    var email = ["email1@acras.com.br", "email2@acras.com.br", "email3@acras.com.br"];
    
    // Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
    var json = JSON.stringify({"emails": email});
    
    request.send(json);
    
    // Sua aplicacao tera que ser capaz de tratar as respostas da API.
    console.log("HTTP code: " + request.status);
    console.log("Corpo: " + request.responseText);
    
    

    Para cada nota autorizada, cancelada ou que tenha sido emitida uma carta de correção o destinatário da nota é notificado via email. Porém eventualmente pode ser necessário enviar a nota fiscal para outras pessoas ou mesmo reenviar o email para o mesmo destinatário.

    Para enviar um ou mais emails:

    https://api.focusnfe.com.br/v2/nfce/REFERENCIA/email

    Utilize o comando HTTP POST para enviar os emails. Esta operação aceita apenas um parâmetro:

    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.

    Outras documentações

    Enviador de Arquivos SAT / NFCe

    Para os usuários de tecnologias que não permitem o acesso à API via Web Services ou que não desejam programar o acesso HTTP, disponibilizamos um comunicador que realiza toda comunicação com os Web Services de nossa API. Para utilizar o enviador de arquivos basta rodar um executável simples e salvar as notas em uma pasta específica que o enviador fará o resto.

    Instalação e Configuração O Enviador de Arquivos não possui um instalador específico, ele é apenas um executável standalone. Este executável quando é rodado irá ler as configurações de um arquivo texto chamado nfce.ini que deve estar localizado na mesma pasta em que ele está e que possui o formato a seguir:

    [nfce] dir=C:\Users\acras\Desktop\nfces cnpj_emitente=20220080000106 token=ipPjf0dTqOw66Hih1eyZjWq7IQIIFgxO producao=0 simples=1

    Quando usado para emitir Cupom Fiscal Eletrônico SAT os campos abaixo são habilitados: codigo_ativacao_sat=bema1234 assinatura_sat=SGR-SAT SISTEMA DE GESTAO E RETAGUARDA DO SAT

    Onde:

    Diretório e nome dos arquivos

    Abaixo do diretório base os diretórios a seguir serão utilizados pelo Enviador de Arquivos:

    Os arquivos a serem enviados devem possuir as extensões: * Para NFCe, .nfce (envios) e .canc (cancelamentos); * Para CFe SAT, .cfe (envios) e .cfecanc (cancelamentos);

    E, deve ser nomeados com a referência a ser utilizada para aquela nota (veja a seção referência nesta documentação). É importante observar que o Enviador de Arquivos não possui qualquer inteligência com relação à referência utilizada, de forma que ele irá apenas repassar para a API. Se uma referência já previamente utilizada for usada novamente você irá receber o erro de nota já autorizada.

    Cancelamentos

    Para realizar o cancelamento da NFCe ou do CFe SAT é necessário salvar um arquivo com o nome igual à referência usada no envio com a extenção de cancelamento na pasta "envios". Neste arquivo a estrutura será igual a de um JSON (usando chave e valor), para CFe SAT, é necessário conter os campos "chave" e "CNPJ" ou "CPF" caso tenha sido informado um dos dois dados no cupom fiscal. Na emissão de cancelamento para NFCe o arquivo deverá a justificativa do cancelamento (que deve conter entre 15 e 200 caracteres).

    Arquivo de cancelamento do CFe SAT (.cfecanc): ´´´json { "chave": "77781082373077987991599000999380000289999993", "cpf": "93515817050" } ´´´

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

    Reimpressão Para realizar a reimpressão de determinada NFCe basta salvar um arquivo com nome igual à ref usada no envio e extensão .reimp.

    Quando a reimpressão for de um Cupom Fiscal Eletrônico do SAT, basta entrar na pasta "pdf" e reimprimir o arquivo.

    CTe e CTe OS (beta)

    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/cfe/REFERENCIA Consulta a CTe com a referência informada e o seu status de processamento
    DELETE /v2/cfe/REFERENCIA Cancela uma CTe com a referência informada
    POST /v2/cte/REFERENCIA/carta_correcao Cria uma carta de correção para a CTe com a referência informada.
    POST /v2/cte/inutilizacao Inutiliza uma numeração da CTe

    Campos de uma 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.

    Envio

    # arquivo.json deve conter os dados da CTe
    curl -u token_enviado_pelo_suporte: \
      -X POST -T cte.json http://homologacao.acrasnfe.acras.com.br/v2/cte?ref=12345
    curl -u token_enviado_pelo_suporte: \
      -X POST -T cte_os.json http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br";
    
    // Substituir pela sua identificação interno do CTe.
    $ref = "12345";
    
    $login = "Token_enviado_pelo_suporte";
    
    $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 = "http://homologacao.acrasnfe.acras.com.br/v2/cte_os"
    
    # Substituir pela sua identificação interno do CTe.
    ref = {"ref":"12345"}
    
    token="Token_enviado_pelo_suporte"
    
    '''
    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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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
    
    
    /*
    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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    $password = "";
    
    // Para ambiente de produção use a variável abaixo:
    // $server = "https://api.focusnfe.com.br";
    
    $server = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/cte/"
    
    # Substituir pela sua identificação interno do CTe.
    ref = "12345"
    
    token="Token_enviado_pelo_suporte"
    
    # 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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br";
    
    $justificativa = array ("justificativa" => "A sua justificativa de cancelamento aqui.");
    
    $login = "Token_enviado_pelo_suporte";
    $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 = "http://homologacao.acrasnfe.acras.com.br/v2/cte/"
    
    # Substituir pela sua identificação interno do CTe.
    ref = "12345"
    
    token="Token_enviado_pelo_suporte"
    
    '''
    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_enviado_pelo_suporte: \
      -X DELETE -d '{"justificativa":"Teste de cancelamento de nota"}' \
      http://homologacao.acrasnfe.acras.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âmetros de cancelamento deverão ser enviados 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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 = 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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br";
    
    // Substituir pela sua identificação interno do CTe.
    $ref = "12345";
    
    $login = "Token_enviado_pelo_suporte";
    $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 = "http://homologacao.acrasnfe.acras.com.br/v2/cte/"
    
    # Substituir pela sua identificação interno do CTe.
    ref = "12345"
    
    token="Token_enviado_pelo_suporte"
    
    '''
    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_enviado_pelo_suporte: \
      -X POST -d '{"campo_corrigido":"observacoes","valor_corrigido":"Nova observação"}' \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* Para ambiente de produção use a variável abaixo:
            String server = "https://api.focusnfe.com.br/"; */
            String server = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 = 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_enviado_pelo_suporte";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br";
    
    $login = "Token_enviado_pelo_suporte";
    $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 = "http://homologacao.acrasnfe.acras.com.br/v2/cte/inutilizacao"
    
    token="Token_enviado_pelo_suporte"
    
    '''
    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:

    Backups (NFe, NFCe e CTe)

    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 (primeira hora do primeiro dia de cada mês) 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 6 meses em nossos servidores.

    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. A listagem dos campos segue abaixo.

    Geral

    Exemplo de um arquivo JSON:

    {  
       "data_emissao":"2017-09-21T22:15:00",
       "prestador":{  
          "cnpj":"18765499000199",
          "inscricao_municipal":"12345",
          "codigo_municipio":"3516200"
       },
       "tomador":{  
          "cnpj":"07504505000132",
          "razao_social":"Acras Tecnologia da Informação LTDA",
          "email":"contato@acras.com.br",
          "endereco":{  
             "logradouro":"Rua Dias da Rocha Filho",
             "numero":"999",
             "complemento":"Prédio 04 - Sala 34C",
             "bairro":"Alto da XV",
             "codigo_municipio":"4106902",
             "uf":"PR",
             "cep":"80045165"
          }
       },
       "servico":{  
          "aliquota":3,
          "discriminacao":"Nota fiscal referente a serviços prestados",
          "iss_retido":"false",
          "item_lista_servico":"0107",
          "codigo_tributario_municipio": "620910000",
          "valor_servicos":1.0
       }
    }
    

    Prestador

    Tomador

    Serviço

    Intermediário

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfse.json"
    
    # Substituir pela sua identificação interna da nota
    ref = {"ref":"12345"}
    
    token="token_enviado_pelo_suporte"
    
    '''
    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_enviado_pelo_suporte: \
      -X POST -T arquivo.json http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/"
    
    # no caso do ambiente de envio ser em produção, utilizar servidor_producao
    url_envio = servidor_homologacao + "v2/nfse?ref=" + ref
    
    # altere os campos conforme a nota que será enviada
    dados_da_nota = {  
      data_emissao: "2017-09-21T22:15:00",
      prestador: {  
          cnpj: "18765499000199",
          inscricao_municipal: "12345",
          codigo_municipio: "3516200"
      },
      tomador: {  
          cnpj: "07504505000132",
          razao_social: "Acras Tecnologia da Informação LTDA",
          email: "contatoacras.com.br",
          endereco: {  
            logradouro: "Rua Dias da Rocha Filho",
            numero: "999",
            complemento: "Prédio 04 - Sala 34C",
            bairro: "Alto da XV",
            codigo_municipio: "4106902",
            uf: "PR",
            cep: "80045165"
          }
      },
      servico: {  
          aliquota: 3,
          discriminacao: "Nota fiscal referente a serviços prestados",
          iss_retido: "false",
          item_lista_servico: "0107",
          codigo_tributario_municipio: "620910000",
          valor_servicos: 1.0
      }
    }
    
    # criamos 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 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 = "http://homologacao.acrasnfe.acras.com.br";
     // Substituir pela sua identificação interna da nota
     $ref = "12345";
     $login = "token_enviado_pelo_suporte";
     $password = "";
     $nfse = array (
        "data_emissao" => "2017-12-27T17:43:14-3:00",
        "incentivador_cultural" => "false",
        "natureza_operacao" => "1",
        "optante_simples_nacional" => "false",
        "prestador" => array(
            "cnpj" => "51916585000125",
            "inscricao_municipal" => "12345",
            "codigo_municipio" => "4119905"
            ),
        "tomador" => array(
          "cnpj" => "07504505000132",
            "razao_social" => "Acras Tecnologia da Informação LTDA",
            "email" => "contato@acras.com.br",
            "endereco" => array(
              "bairro" => "Jardim America",
              "cep" => "81530900",
              "codigo_municipio" => "4119905",
              "logradouro" => "Rua ABC",
              "numero" => "16",
              "uf" => "PR"
             )
        ),
        "servico" => array(
               "discriminacao" => "Exemplo Servi\u00e7o",
               "iss_retido" => "false",
               "item_lista_servico" => "106",
               "codigo_cnae" => "6319400",
               "valor_servicos" => "1.00"
        ),
      );
     // Inicia o processo de envio das informações usando o cURL
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $server."/v2/nfse?ref=" . $ref);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($ch, CURLOPT_POST, 1);
     curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($nfse));
     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
     curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
     $body = curl_exec($ch);
     $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
     //as três linhas abaixo imprimem as informações retornadas pela API, aqui o seu sistema deverá
     //interpretar e lidar com o retorno
     print($http_code."\n");
     print($body."\n\n");
     print("");
     curl_close($ch);
     ?>
    
    
    /*
    As orientacoes a seguir foram extraidas do site do NPMJS: https://www.npmjs.com/package/xmlhttprequest
    Here's how to include the module in your project and use as the browser-based XHR object.
    Note: use the lowercase string "xmlhttprequest" in your require(). On case-sensitive systems (eg Linux) using uppercase letters won't work.
    */
    var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
    
    var request = new XMLHttpRequest();
    
    var token = "Token_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfse?ref=" + ref;
    
    /*
    Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
    Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
    */
    request.open('POST', url, false, token);
    
    var nfse = {  
       "data_emissao":"2018-03-21",
       "prestador":{  
          "cnpj":"51916585000125",
          "inscricao_municipal":"12345",
          "codigo_municipio":"3518800"
       },
       "tomador":{  
          "cnpj":"07504505000132",
          "razao_social":"Acras Tecnologia da Informacao LTDA",
          "email":"contato@acras.com.br",
          "endereco":{  
             "logradouro":"Rua Filho da Rocha Bage",
             "numero":"750",
             "complemento":"Sala 07",
             "bairro":"Alto da Rua XV",
             "codigo_municipio":"4106902",
             "uf":"PR",
             "cep":"80045165"
          }
       },
       "servico":{  
          "aliquota":3,
          "discriminacao":"Nota fiscal referente a servicos prestados",
          "iss_retido":"false",
          "item_lista_servico":"1401",
          "codigo_tributario_municipio": "452000100",
          "valor_servicos":1.0
       }
    };
    
    // Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
    request.send(JSON.stringify(nfse));
    
    // Sua aplicacao tera que ser capaz de tratar as respostas da API.
    console.log("HTTP code: " + request.status);
    console.log("Corpo: " + request.responseText);
    
    

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

    {
      "cnpj_prestador": "CNPJ_PRESTADOR",
      "ref": "REFERENCIA",
      "status": "processando_autorizacao"
    }
    

    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.json?ref=REFERENCIA

    Utilize o comando HTTP POST para enviar a sua nota para nossa API.

    Nesta etapa, é feita uma primeira validação dos dados da nota. Caso ocorra algum problema, por exemplo, algum campo faltante, formato incorreto ou algum problema com o prestador a nota não será aceita para processamento e será devolvida a mensagem de erro apropriada. Veja a seção erros.

    Caso a nota seja validada corretamente, a nota será aceita para processamento. Isto significa que a nota irá para uma fila de processamento onde eventualmente será processada (processamento assíncrono). Com isto, a nota poderá ser autorizada ou ocorrer um erro na autorização de acordo com a validação da prefeitura.

    Para verificar se a nota já foi autorizada, você terá que efetuar uma consulta ou se utilizar de gatilhos.

    Consulta

    # Faça o download e instalação da biblioteca requests, através do python-pip.
    import requests
    
    '''
    Para ambiente de produção use a variável abaixo:
    url = "https://api.focusnfe.com.br"
    '''
    url = "http://homologacao.acrasnfe.acras.com.br/v2/nfse/"
    
    # Substituir pela sua identificação interna da nota
    ref = "12345"
    
    token="token_enviado_pelo_suporte"
    
    r = requests.get(url+ref+".json", 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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/"
    
    # no caso do ambiente de envio ser em produção, utilizar servidor_producao
    url_envio = servidor_homologacao + "v2/nfse/" + ref
    
    # 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
     // Você deve definir isso globalmente para sua aplicação
     //Substituir pela sua identificação interna da nota
     $ref = "12345";
     $login = "token_enviado_pelo_suporte";
     $password = "";
     // Para ambiente de produção use a variável abaixo:
     // $server = "https://api.focusnfe.com.br";
     $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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);
    
    

    Exemplo de resposta da consulta de NFSe:

    {
      "cnpj_prestador":"19151707200188",
      "ref":"123",
      "status":"autorizado",
      "numero":"9999",
      "codigo_verificacao":"311299647",
      "data_emissao":"2017-09-09T10:20:00-03:00",
      "url":"http://visualizar.ginfes.com.br/report/consultarNota?__report=nfs_ver2&amp;cdVerificacao=311299647&amp;numNota=9999&amp;cnpjPrestador=19151707200188",
    "caminho_xml_nota_fiscal":"/notas_fiscais_servico/NFSe191517072001883518800-1898781-9999-312276647.xml"
    }
    

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

    Utilize o comando HTTP GET para consultar a sua nota para nossa API.

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfse/"
    
    # Substituir pela sua identificação interna da nota
    ref = "12345"
    
    token="token_enviado_pelo_suporte"
    
    '''
    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+".json", 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_enviado_pelo_suporte: \
      -X DELETE -d '{"justificativa":"Teste de cancelamento de nota"}' \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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 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 = "http://homologacao.acrasnfe.acras.com.br";
     $justificativa = array ("justificativa" => "Teste de cancelamento de nota");
     $login = "token_enviado_pelo_suporte";
     $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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.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);
    
    

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

    {
      "status": "cancelado"
    }
    

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

    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.

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfse/"
    
    # Substituir pela sua identificação interna da nota
    ref = "12345"
    
    token="token_enviado_pelo_suporte"
    
    '''
    Usamos um dicionario para armazenar os campos e valores que em seguida,
    serao convertidos a JSON e enviados para nossa API
    '''
    emails = {}
    email = "suporte@acras.com.br"
    emails["emails"] = [email]
    
    r = requests.delete(url+ref+"/email", data=json.dumps(emails), auth=(token,""))
    
    # Mostra na tela o codigo HTTP da requisicao e a mensagem de retorno da API
    print(r.status_code, r.text)
    
    
    
    curl -u token_enviado_pelo_suporte: \
      -X POST -d '{"emails":["alguem@example.org"]}' \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.com.br/";
    
            String url = server.concat("v2/nfse/"+ref+"/email");
    
            /* Criamos o um objeto JSON que receberá um JSON Array com a lista de e-mails. */
            JSONObject json = new JSONObject ();
            JSONArray listaEmails = new JSONArray();
            listaEmails.put("email_01@acras.com.br");
            listaEmails.put("email_02@acras.com.br");
            listaEmails.put("email_03@acras.com.br");
            json.put("emails", listaEmails);
    
            /* Testar se o JSON gerado está dentro do formato esperado.
            System.out.print(json); */
    
            /* Configuração para realizar o HTTP BasicAuth. */
            Object config = new DefaultClientConfig();
            Client client = Client.create((ClientConfig) config);
            client.addFilter(new HTTPBasicAuthFilter(login, ""));
    
            WebResource request = client.resource(url);
    
            ClientResponse resposta = request.post(ClientResponse.class, json);
    
            int httpCode = resposta.getStatus();
    
            String body = resposta.getEntity(String.class);
    
            /* As três linhas abaixo imprimem as informações retornadas pela API.
             * Aqui o seu sistema deverá interpretar e lidar com o retorno. */
            System.out.print("HTTP Code: ");
            System.out.print(httpCode);
            System.out.printf(body);
        }
    }
    
    
    # encoding: UTF-8
    
    require "net/http"
    require "net/https"
    require "json"
    
    # token enviado pelo suporte
    token = "codigo_alfanumerico_token"
    
    # referência da nota - deve ser única para cada nota enviada
    ref = "id_referencia_nota"
    
    # endereço da api que deve ser usado conforme o ambiente: produção ou homologação
    servidor_producao = "https://api.focusnfe.com.br/"
    servidor_homologacao = "http://homologacao.acrasnfe.acras.com.br/"
    
    # no caso do ambiente de envio ser em produção, utilizar servidor_producao
    url_envio = servidor_homologacao + "v2/nfse/" + ref + "/email"
    
    # altere os campos conforme a nota que será enviada
    emails_destinatarios = {
      emails: ["email_01@acras.com.br", "email_02@acras.com.br", "email_03@acras.com.br"]
    }
    
    # criamos 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 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 = "http://homologacao.acrasnfe.acras.com.br";
     // Substituir pela sua identificação interna da nota
     $ref = "12345";
     $login = "token_enviado_pelo_suporte";
     $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_enviado_pelo_suporte";
    
    // 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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfse/" + ref + "/email";
    
    /*
    Use o valor 'false', como terceiro parametro para que a requisicao aguarde a resposta da API
    Passamos o token como quarto parametro deste metodo, como autenticador do HTTP Basic Authentication.
    */
    request.open('POST', url, false, token);
    
    var email = ["email1@acras.com.br", "email2@acras.com.br", "email3@acras.com.br"];
    
    // Aqui fazermos a serializacao do JSON com os dados da nota e enviamos atraves do metodo usado.
    var json = JSON.stringify({"emails": email});
    
    request.send(json);
    
    // Sua aplicacao tera que ser capaz de tratar as respostas da API.
    console.log("HTTP code: " + request.status);
    console.log("Corpo: " + request.responseText);
    
    

    Para cada nota autorizada, cancelada ou que tenha sido emitida uma carta de correção o destinatário da nota é notificado via email. Porém eventualmente pode ser necessário enviar a nota fiscal para outras pessoas ou mesmo reenviar o email para o mesmo destinatário.

    Para enviar um ou mais emails:

    https://api.focusnfe.com.br/v2/nfse/REFERENCIA/email

    Utilize o comando HTTP POST para enviar os emails. Esta operação aceita apenas um parâmetro:

    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.

    Manifestação

    A API para manifestação do sistema Focus permite que você consulte todas as notas recebidas pela sua empresa 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@acras.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.

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfes_recebidas/"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte: \
      -X POST -d '{"tipo":"confirmacao"}' \
      http://homologacao.acrasnfe.acras.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_enviado_pelo_Suporte";
            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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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_enviado_pelo_Suporte";
     $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 = "http://homologacao.acrasnfe.acras.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, 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_enviado_pelo_suporte";
    
    var chave = "chave_da_nota_fiscal";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfes_recebidas/"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_Suporte";
            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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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_enviado_pelo_Suporte";
     $chave = "Chave_de_identificação_da_NFe";
    // Para ambiente de Produção, utilize a URL: https://api.focusnfe.com.br/.  
     $server = "http://homologacao.acrasnfe.acras.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 de hora em hora.

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfes_recebidas?cnpj="
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte: \
      "http://homologacao.acrasnfe.acras.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_enviado_pelo_Suporte";
            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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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_enviado_pelo_Suporte";
     $cnpj = "CNPJ_da_sua_empresa";
    // Para ambiente de Produção, utilize a URL: https://api.focusnfe.com.br/.  
     $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
    var cnpj = "cnpj_do_destinatario_da_nota";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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/nfe_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. 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 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_enviado_pelo_suporte";
    
    var chave = "chave_da_nota_fiscal";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfes_recebidas/"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.com.br/v2/nfe_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_enviado_pelo_Suporte";
            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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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_enviado_pelo_Suporte";
     $chave = "Chave_de_identificação_da_NFe";
    // Para ambiente de Produção, utilize a URL: https://api.focusnfe.com.br/.  
     $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
    var chave = "chave_da_nota_fiscal";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfes_recebidas/"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte: \
      "http://homologacao.acrasnfe.acras.com.br/v2/nfe_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_enviado_pelo_Suporte";
            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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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_enviado_pelo_Suporte";
     $chave = "Chave_de_identificação_da_NFe";
    // Para ambiente de Produção, utilize a URL: https://api.focusnfe.com.br/.  
     $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
    var chave = "chave_da_nota_fiscal";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfes_recebidas/"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.com.br/v2/nfe_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_enviado_pelo_Suporte";
            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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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_enviado_pelo_Suporte";
     $chave = "Chave_de_identificação_da_NFe";
    // Para ambiente de Produção, utilize a URL: https://api.focusnfe.com.br/.  
     $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
    var chave = "chave_da_nota_fiscal";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/v2/nfes_recebidas/"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.com.br/v2/nfe_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_enviado_pelo_Suporte";
            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 = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.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 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_enviado_pelo_Suporte";
     $chave = "Chave_de_identificação_da_NFe";
    // Para ambiente de Produção, utilize a URL: https://api.focusnfe.com.br/.  
     $server = "http://homologacao.acrasnfe.acras.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 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 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.

    Gatilhos / Webhooks

    Informações gerais

    Gatilhos ou "WebHooks" são eventos automaticos 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 a sua escolha, através do método POST. Cada acionamento do gatilho contém os dados de apenas uma nota. A API enviará as seguintes informações para sua URL:

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

    Para NFSe:

    A vantagem de utilizar gatilhos é que não haverá a necessidade de fazer "pulling" (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.

    Eventos

    Os seguintes eventos causam o acionamento do gatilho:

    Os gatilhos para autorização de CTe deverão ser disponibilizados em breve.

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/hooks"
    
    token="token_enviado_pelo_suporte"
    
    '''
    Usamos um dicionario para armazenar os campos e valores que em seguida,
    serao convertidos a JSON e enviados para nossa API
    '''
    dados = {}
    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_enviado_pelo_suporte: \
      -X POST -d '{"cnpj":"51916585000125","event":"nfe","url":"http://minha.url/nfe"}' \
      http://homologacao.acrasnfe.acras.com.br/v2/hooks
    
    <?php
    $ch = curl_init();
    $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte:");
    $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_enviado_pelo_suporte";
    
            /* Para ambiente de produção use a variável abaixo:
            String server = "https://api.focusnfe.com.br/"; */
            String server = "http://homologacao.acrasnfe.acras.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>();
    
            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_enviado_pelo_suporte";
    
    var url = "http://homologacao.acrasnfe.acras.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,
      "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 apenas um gatilho por evento

    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 = "http://homologacao.acrasnfe.acras.com.br/v2/hooks/"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.com.br/v2/hooks/Vj5rmkBq
    
    <?php
    $ch = curl_init();
    $hook_id = "Vj5rmkBq"
    $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte:");
    $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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
    var hook_id = "n65g0RP1";
    
    var url = "http://homologacao.acrasnfe.acras.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,
      "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 = "http://homologacao.acrasnfe.acras.com.br/v2/hooks/"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte: -X DELETE \
     http://homologacao.acrasnfe.acras.com.br/v2/hooks/Vj5rmkBq
    
    <?php
    $ch = curl_init();
    $hook_id = "Vj5rmkBq"
    $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte:");
    $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_enviado_pelo_suporte";
    
            /* 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 = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte";
    
    var hook_id = "n65g0RP1";
    
    var url = "http://homologacao.acrasnfe.acras.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,
      "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".

    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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.com.br/v2/ncms?capitulo=90
    
    <?php
    $ch = curl_init();
    $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte:");
    $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_enviado_pelo_suporte";
    
            /* Para ambiente de produção use a variável abaixo:
            String server = "https://api.focusnfe.com.br/"; */
            String server = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/"
    
    # no caso do ambiente de envio ser em produção, utilizar servidor_producao
    url_envio = servidor_homologacao + "v2/ncms?capitulo=90"
    
    # 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::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 = "http://homologacao.acrasnfe.acras.com.br/v2/ncms?capitulo=90"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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:

    http://homologacao.acrasnfe.acras.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.

    http://homologacao.acrasnfe.acras.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:

    http://homologacao.acrasnfe.acras.com.br/v2/ncms?codigo=7022

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

    Registros 51 a 100: http://homologacao.acrasnfe.acras.com.br/v2/ncms?codigo=7022&offset=50

    Registros 101 a 123: http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte: \
      http://homologacao.acrasnfe.acras.com.br/v2/cfops?codigo=2
    
    <?php
    $ch = curl_init();
    $server = "http://homologacao.acrasnfe.acras.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_enviado_pelo_suporte:");
    $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_enviado_pelo_suporte";
    
            /* Para ambiente de produção use a variável abaixo:
            String server = "https://api.focusnfe.com.br/"; */
            String server = "http://homologacao.acrasnfe.acras.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 = "http://homologacao.acrasnfe.acras.com.br/"
    
    # no caso do ambiente de envio ser em produção, utilizar servidor_producao
    url_envio = servidor_homologacao + "v2/cfops?codigo=2"
    
    # 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::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 = "http://homologacao.acrasnfe.acras.com.br/v2/cfops?codigo=2"
    
    token="token_enviado_pelo_suporte"
    
    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_enviado_pelo_suporte";
    
    /*
    Para ambiente de producao use a URL abaixo:
    "https://api.focusnfe.com.br"
    */
    var url = "http://homologacao.acrasnfe.acras.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:

    http://homologacao.acrasnfe.acras.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.

    http://homologacao.acrasnfe.acras.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:

    http://homologacao.acrasnfe.acras.com.br/v2/cfops?codigo=2

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

    Registros 51 a 100: http://homologacao.acrasnfe.acras.com.br/v2/cfops?codigo=2&offset=50

    Registros 101 a 123: http://homologacao.acrasnfe.acras.com.br/v2/cfops?codigo=2&offset=100

    Revenda

    A API de Revenda ainda não foi migrada para a versão 2.0, você pode consultar a versão anterior aqui

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

    Códigos de exemplo no GitHub

    Você pode consultar os exemplos de códigos nos seguintes repositórios gits: