1. Go to this page and download the library: Download jcf/espiaonfe library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
jcf / espiaonfe example snippets
// Consulta pelo período de emissão do documento
->tipoPeriodoEmissao()
// Consulta pelo período de inclusão no Espião Cloud
->tipoPeriodoInclusao()
// Ou use diretamente (E = emissão, I = inclusão)
->tipoPeriodo('E')
->tipoPeriodo('I')
// Métodos intuitivos para cada modelo
->modeloNfe() // NF-e (modelo 55)
->modeloNfce() // NFC-e (modelo 65)
->modeloCte() // CT-e (modelo 57)
->modeloCteOs() // CT-e OS (modelo 67)
->modeloSat() // SAT (modelo 59)
->modeloNfse() // NFS-e Nacional (modelo 41)
// Ou use diretamente com o código do modelo
->modelo('55') // 55, 65, 57, 67, 59, 41
use Jcf\EspiaoNfe\Facades\EspiaoNfe;
// Listar empresas (limite de 100 por página)
$empresas = EspiaoNfe::empresas()->get();
// Navegar para próxima página usando o código retornado
$codigoProxima = $empresas['codigoProximaPagina']; // Ex: "200"
if ($codigoProxima !== '-1') {
$empresas = EspiaoNfe::empresas()
->codigoProximaPagina($codigoProxima)
->get();
}
// Filtrar por CNPJ/CPF
$empresa = EspiaoNfe::empresas()
->cnpjCpf('12345678000190')
->get();
// Criar uma nova empresa
$empresa = EspiaoNfe::empresas()->create([
'cnpj' => '12345678000190',
'razao_social' => 'Minha Empresa LTDA',
]);
// Atualizar uma empresa
$empresa = EspiaoNfe::empresas()
->find('12345678000190')
->update(['razao_social' => 'Nova Razão Social']);
// Consultar NF-e por período (até 100 por página)
$nfeResumo = EspiaoNfe::nfe()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->modeloNfe() // Método intuitivo para modelo 55 (NF-e)
->get();
// Consultar NFC-e (Nota Fiscal de Consumidor)
$nfceResumo = EspiaoNfe::nfe()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->modeloNfce() // Método intuitivo para modelo 65 (NFC-e)
->get();
// Consultar SAT (Sistema Autenticador e Transmissor)
$satResumo = EspiaoNfe::nfe()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->modeloSat() // Método intuitivo para modelo 59 (SAT)
->get();
// Ou usar modelo() diretamente
$nfeResumo = EspiaoNfe::nfe()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->modelo('55') // 55 (NF-e), 65 (NFC-e) ou 59 (SAT)
->get();
// Manifestar NF-e
$resultado = EspiaoNfe::nfe()->manifestar([
'chave' => '35191234567890123456789012345678901234567890',
'tipo' => '210200',
]);
// Consultar CT-e por período (até 100 por página)
$cteResumo = EspiaoNfe::cte()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->modeloCte() // Método intuitivo para modelo 57 (CT-e)
->get();
// Ou usar modelo() diretamente
$cteResumo = EspiaoNfe::cte()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->modelo('57') // 57 (CT-e)
->get();
// Desacordo de CT-e
$resultado = EspiaoNfe::cte()->desacordo([
'chave' => '35191234567890123456789012345678901234567890',
'motivo' => 'Mercadoria não recebida',
]);
// Consultar NFSe por período (até 100 por página)
$nfseResumo = EspiaoNfe::nfse()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->get();
// NFSe por cidade
$nfsePorCidade = EspiaoNfe::nfse()->porCidade([
'cnpjCpf' => '12345678000190',
'cidade' => '3550308',
'dataInicial' => '01/01/2024',
'dataFinal' => '31/01/2024',
]);
// Cidades homologadas
$cidades = EspiaoNfe::nfse()->cidadesHomologadas();
// Listar XMLs de NF-e por período de emissão
$xmls = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->tipoPeriodoEmissao() // Período de emissão
->modeloNfe() // Modelo 55 (NF-e)
->get();
// XMLs de NFC-e por período de inclusão
$xmls = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->tipoPeriodoInclusao() // Período de inclusão no sistema
->modeloNfce() // Modelo 65 (NFC-e)
->get();
// XMLs de CT-e
$xmls = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->tipoPeriodoEmissao()
->modeloCte() // Modelo 57 (CT-e)
->get();
// XMLs de CT-e OS (Outros Serviços)
$xmls = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->tipoPeriodoEmissao()
->modeloCteOs() // Modelo 67 (CT-e OS)
->get();
// XMLs de SAT
$xmls = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->tipoPeriodoEmissao()
->modeloSat() // Modelo 59 (SAT)
->get();
// XMLs de NFS-e Nacional
$xmls = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->tipoPeriodoInclusao()
->modeloNfse() // Modelo 41 (NFS-e Nacional)
->get();
// Ou usar tipoPeriodo() e modelo() diretamente
$xmls = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->tipoPeriodo('E') // E (emissão) ou I (inclusão)
->modelo('55') // 55, 65, 57, 67, 59, 41
->get();
// Obter XML por chave
$xml = EspiaoNfe::xmls()->porChave('35191234567890123456789012345678901234567890');
// Obter PDF por chave
$pdf = EspiaoNfe::xmls()->pdfPorChave('35191234567890123456789012345678901234567890');
// Importar XML
$resultado = EspiaoNfe::xmls()->importar([
'xml' => '<?xml version="1.0"...',
'cnpjCpf' => '12345678000190',
]);
// Cenário: Uma NF-e foi emitida em 10/01/2024, mas só foi incluída no Espião Cloud em 25/01/2024
// Por emissão - ENCONTRA a NF-e
$xmlsEmissao = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '15/01/2024')
->tipoPeriodoEmissao()
->modelo('55')
->get();
// Por inclusão - NÃO encontra (foi incluída depois do período)
$xmlsInclusao = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '15/01/2024')
->tipoPeriodoInclusao()
->modelo('55')
->get();
// Por inclusão - ENCONTRA a NF-e (período inclui 25/01/2024)
$xmlsInclusao = EspiaoNfe::xmls()
->cnpjCpf('12345678000190')
->periodo('20/01/2024', '31/01/2024')
->tipoPeriodoInclusao()
->modelo('55')
->get();
// Consultar logs de NF-e
$logs = EspiaoNfe::logs()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->modeloNfe() // Logs de NF-e (modelo 55)
->tipo('erro') // opcional
->get();
// Consultar logs de CT-e
$logs = EspiaoNfe::logs()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->modeloCte() // Logs de CT-e (modelo 57)
->get();
// Ou usar modelo() diretamente
$logs = EspiaoNfe::logs()
->cnpjCpf('12345678000190')
->periodo('01/01/2024', '31/01/2024')
->modelo('55') // 55 (NF-e) ou 57 (CT-e)
->get();
// Com paginação
$codigoProxima = $logs['codigoProximaPagina'];
if ($codigoProxima !== '-1') {
$maisLogs = EspiaoNfe::logs()
->cnpjCpf('12345678000190')
->codigoProximaPagina($codigoProxima)
->modeloNfe()
->get();
}
// Validação automática de formato de data
try {
EspiaoNfe::nfe()
->cnpjCpf('12345678000190')
->periodo('2024-01-01', '31/01/2024'); // Formato inválido
} catch (\InvalidArgumentException $e) {
echo $e->getMessage(); // "Formato de data inválido: '2024-01-01'. Use: DD/MM/AAAA"
}
// Validação de ordem de período
try {
EspiaoNfe::nfe()
->cnpjCpf('12345678000190')
->periodo('31/01/2024', '01/01/2024'); // Data inicial depois da final
} catch (\InvalidArgumentException $e) {
echo $e->getMessage(); // "A data inicial (31/01/2024) deve ser anterior ou igual à data final (01/01/2024)"
}
// Validação de CNPJ/CPF
try {
EspiaoNfe::nfe()->cnpjCpf('123'); // CNPJ/CPF inválido
} catch (\InvalidArgumentException $e) {
echo $e->getMessage(); // "CNPJ/CPF inválido: deve ter 11 dígitos (CPF) ou 14 dígitos (CNPJ)"
}
use Jcf\EspiaoNfe\Exceptions\AuthenticationException;
use Jcf\EspiaoNfe\Exceptions\NotFoundException;
use Jcf\EspiaoNfe\Exceptions\ValidationException;
use Jcf\EspiaoNfe\Exceptions\EspiaoNfeException;
try {
$certificados = EspiaoNfe::certificados()->get();
} catch (AuthenticationException $e) {
// Erro 401/403 - Problema de autenticação
// Verifique se os tokens estão corretos
} catch (NotFoundException $e) {
// Erro 404 - Recurso não encontrado
// Verifique se o ID do recurso está correto
} catch (ValidationException $e) {
// Erro 422 - Erro de validação
// Verifique os dados enviados na requisição
} catch (EspiaoNfeException $e) {
// Outros erros HTTP (500, 503, etc.)
// Erro geral da API
}