REST API v2.5 SYSTEM OPERATIONAL

Documentación NFE API

Bienvenido a la documentación de NFE API. API completa para emisión, consulta y cancelación de Facturas Electrónicas (NF-e) en Brasil. Soporta cálculo automático de impuestos (ICMS, IPI, PIS/COFINS), generación de XML, autorización SEFAZ e integración con sistemas de gestión.

list_alt

Campos Importantes de la API

Interpretación de Campos Críticos

Esta sección explica los campos más importantes de NFE API que son esenciales para el correcto funcionamiento de la emisión de facturas.

⚠️ ATENCIÓN: La configuración correcta de estos campos es fundamental para la emisión válida de facturas. Consulte siempre la legislación tributaria vigente.
Campo Descripción Valores Posibles Importancia
invoice_type Tipo de empresa (persona jurídica/física) juridica, fisica Alta - Define el régimen tributario
nature_of_operation Naturaleza de la operación (venta, devolución, etc.) Ej: VENDA, DEVOLUCAO Alta - Determina el CFOP
transaction_type Tipo de transacción (entrada/salida) ENTRADA, SAIDA Alta - Dirige el flujo fiscal
model Modelo de la factura nfe, nfce Alta - Modelo del documento
issuance_type Tipo de emisión (normal, contingencia) NORMAL, CONTINGENCIA Media - Modo de emisión
ambiente Ambiente de procesamiento PRODUCAO, HOMOLOGACAO Alta - Define SEFAZ destino
cliente Tipo de cliente/comprador CONSUMIDOR, CONTRIBUINTE Alta - Impacta en los impuestos
products.origem Origen del producto (nacional/importado) 0 a 8 Alta - Determina tributación
products.indicador_total Si el producto entra en el total de la NF true, false Media - Para ítems de muestra
💡 CONSEJO: Para productos, el campo origem es crítico: 0-Nacional, 1-Extranjera importación directa, 2-Extranjera adquirida en el mercado interno, etc. Consulte la tabla completa de origen de mercancías.
sync_alt

Flujo del Proceso de Emisión

Diagrama completo de la emisión de NF-e

El flujo completo de emisión de factura electrónica en Brasil, desde la creación de la empresa hasta la generación de los archivos finales.

business

1. Crear Empresa

Crear información fiscal de la empresa local en Brasil

send

2. Push de Información

Datos del pedido (usuario, dirección, impuestos del producto)

receipt

3. Emitir Factura

Procesar y enviar para autorización SEFAZ

assignment_returned

4. Retornar Resultado

Estado de la emisión y datos de la NF-e

description

5. Generar Archivos

XML y PDF de la factura

published_with_changes

Verificación Fiscal

Validación con SEFAZ

check_circle

Éxito

error

Fallo

Configuración Inicial
Procesamiento de Datos
Emisión Fiscal
Resultados Positivos
📊 Flujo Detallado: El proceso sigue una secuencia lógica: (1) Configuración de la empresa → (2) Recepción de los datos del pedido → (3) Procesamiento y emisión de la NF-e → (4) Retorno del estado → (5) Generación de los archivos. El punto de decisión (Verificación Fiscal) determina si la emisión fue autorizada por la SEFAZ.
flash_on

Referencia Rápida de Endpoints

Todos los endpoints de NFE API

Visión general completa de todos los endpoints disponibles en la API. Use esta tabla como referencia rápida para navegar en la documentación.

URL Base
https://api.tffiscal.com
Path Método HTTP Función
business Gestión de Empresas
/api/company/create POST Crear empresa
/api/company/v2/create POST Crear empresa (simplificado)
/api/company/get_detail GET Consultar empresa
/api/company/edit POST Modificar empresa
/api/company/get_list GET Listar empresas
/api/company/get_cep_detail GET Consultar CEP
/api/company/get_export_invoice_month_files GET Archivos exportados mensuales
category Gestión de Categorías/Impuestos
/api/category/get_list GET Listar categorías de impuestos
/api/category/create POST Crear categoría de impuestos
/api/category/get_detail GET Consultar detalles de la categoría
/api/category/edit POST Editar categoría de impuestos
/api/category/delete POST Eliminar categoría de impuestos
receipt Gestión de Facturas
/api/invoice/create POST Emitir factura
/api/invoice/get_list GET Listar facturas
/api/invoice/get_detail GET Consultar detalles de la factura
/api/invoice/refresh POST Actualizar estado de la factura
/api/invoice/cancel POST Cancelar factura
/api/invoice/invalid POST Invalidar número de la factura
/api/invoice/return POST Devolución de factura
/api/invoice/get_xml POST Exportar XML de la factura
receipt NFC-e (Factura de Consumidor)
/api/nfce/company/create POST Registrar empresa NFC-e
/api/nfce/company/update POST Actualizar empresa NFC-e
/api/nfce/company/get POST Consultar empresa NFC-e
/api/nfce/create POST Emitir NFC-e
/api/nfce/cancel POST Cancelar NFC-e
/api/nfce/get_detail POST Consultar NFC-e
/api/nfce/get_danfe POST Obtener DANFE NFC-e
description NFS-e (Nota de Servicio)
/api/nfse/create POST Emitir NFS-e
/api/nfse/cancel POST Cancelar NFS-e
/api/nfse/get_danfse POST Obtener DANFSE (PDF)
/api/nfse/get_xml POST Descargar XML NFS-e
📋 Notas Importantes:
  • Todos los endpoints requieren autenticación via headers: sign, timestamp, token
  • Para crear empresa y listar empresas, use el token del distribuidor (b2b_token)
  • El Content-Type debe ser siempre application/json;charset=utf-8
  • Las respuestas siguen el patrón JSON con campos success, message y data
200

Éxito

Petición procesada con éxito

400

Error del Cliente

Datos inválidos o faltantes

500

Error del Servidor

Error interno en el servidor

account_balance

NFE API

Factura Electrónica Brasileña (NF-e)

API completa para emisión, consulta y cancelación de Facturas Electrónicas (NF-e) en Brasil. Soporta cálculo automático de impuestos (ICMS, IPI, PIS/COFINS), generación de XML, autorización SEFAZ e integración con sistemas de gestión. Actualmente soporta emisión de facturas para productos en todo territorio brasileño.

Base URL (Producción)
https://api.tffiscal.com/v1
Autenticación
Headers: sign, timestamp, token
Requisitos
Certificado Digital A1 válido

sync_alt Flujo del Sistema

input Datos de Entrada
  • Información del Cliente
  • Datos de los Productos
  • Información Fiscal
  • Datos de Transporte
settings Procesamiento
  • Validación de los datos
  • Cálculo de impuestos
  • Generación del XML
  • Autorización SEFAZ
download Salida
  • XML de la factura
  • PDF de la factura
  • DANFE (Documento Auxiliar)
  • Estado de autorización

Endpoints Principales

POST /api/company/create
Registrar nueva empresa emisora

Registra una empresa emisora vinculada a una cuenta de distribuidor (b2b). Use este endpoint cuando los datos de la empresa ya estén disponibles. Para extracción automática desde el certificado digital, use /api/company/v2/create.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken del distribuidor (b2b — la cuenta debe tener isb2b=true)
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
Identificación
cnpj *stringCNPJ de la empresa emisora
name *stringRazón social
ie *stringInscripción Estatal (Inscrição Estadual)
invoice_type *stringRégimen tributario (ej.: "simples_nacional", "normal")
unit *stringTipo de unidad
emailstringCorreo electrónico de la empresa
Dirección
cep *stringCódigo postal
address *stringDirección (calle)
house_number *stringNúmero de dirección
town *stringBarrio
city *stringCiudad
state *stringUF (sigla del estado)
Certificado digital
cert_file *stringURL HTTPS del certificado digital A1 (.pfx o .p12)
cert_pwd *stringContraseña del certificado
Numeración y configuración
serie *intSerie de la NF-e
number *intNúmero inicial de la numeración
is_create_category_templatebooleanCrea categorías fiscales por defecto automáticamente. Default: true

* Campo obligatorio.

Ejemplo de carga útil

        {
          "cnpj": "12345678000199",
          "name": "Empresa Exemplo LTDA",
          "ie": "123456789",
          "invoice_type": "simples_nacional",
          "unit": "UN",
          "email": "contacto@empresa.com",
          "cep": "01001000",
          "address": "Calle Ejemplo",
          "house_number": "100",
          "town": "Centro",
          "city": "São Paulo",
          "state": "SP",
          "cert_file": "https://ejemplo.com/cert.pfx",
          "cert_pwd": "senha_do_certificado",
          "serie": 1,
          "number": 1
        }

Respuesta

        {
          "success": true,
          "data": {
            "company_id": "comp_789012",
            "token": "eyJhbGciOiJIUzI1NiIs..."
          }
        }
POST /api/company/v2/create
Registrar empresa con autocompletado mediante certificado

Versión simplificada de /api/company/create: la API valida el certificado digital y extrae automáticamente razón social, IE, dirección y otros datos mediante consulta interna. Solo cnpj, cert_file y cert_pwd son obligatorios.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken del distribuidor (b2b — la cuenta debe tener isb2b=true)
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
cnpj *stringCNPJ de la empresa emisora
cert_file *stringURL HTTPS del certificado digital A1 (.pfx o .p12)
cert_pwd *stringContraseña del certificado
is_create_category_templatebooleanCrea categorías fiscales por defecto automáticamente. Default: true

* Campo obligatorio.

Ejemplo de carga útil

        {
          "cnpj": "12345678000199",
          "cert_file": "https://ejemplo.com/cert.pfx",
          "cert_pwd": "senha_do_certificado"
        }

Respuesta

        {
          "success": true,
          "data": {
            "company_id": "comp_789012",
            "token": "eyJhbGciOiJIUzI1NiIs..."
          }
        }
POST /api/company/edit
Editar datos de la empresa

Actualiza los datos de la empresa emisora. Envíe solo los campos que desea modificar — todos excepto company_id son opcionales. El CNPJ es inmutable: enviarlo devuelve error. Al actualizar cep, el sistema resuelve automáticamente stateCode e ibge. Cuando cert_file y cert_pwd vienen juntos, el certificado se valida antes de guardar.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
company_id *stringID de la empresa a editar
namestringRazón social
invoice_typestringRégimen tributario
iestringInscripción Estatal
unitstringTipo de unidad
emailstringCorreo electrónico
cepstringCódigo postal (actualiza automáticamente stateCode e ibge)
addressstringDirección
house_numberstringNúmero
townstringBarrio
citystringCiudad
statestringUF
cert_filestringURL HTTPS del nuevo certificado (.pfx o .p12). Si se envía junto con cert_pwd, se valida antes de guardar
cert_pwdstringNueva contraseña del certificado
serieintNueva serie de la NF-e
numberintNuevo número inicial

* Campo obligatorio. Enviar cnpj devuelve error.

Ejemplo de carga útil

                {
                  "company_id": "comp_789012",
                  "name": "Nova Razão Social LTDA",
                  "email": "nuevo@empresa.com",
                  "cep": "01310100"
                }

Respuesta

                {
                  "success": true
                }
GET /api/company/get_list
Listar empresas del distribuidor

Lista, con paginación, las empresas emisoras vinculadas a la cuenta de distribuidor (b2b). Parámetros vía query string.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken del distribuidor (b2b — la cuenta debe tener isb2b=true)
signstringFirma MD5 (path incluye la query string)
timestampstringUnix timestamp en segundos

Query string

ParámetroTipoDescripción
page *intNúmero de página (≥ 1)
page_size *intTamaño de página (1–20)

* Campo obligatorio.

Ejemplo de llamada

GET /api/company/get_list?page=1&page_size=10

Respuesta

        {
          "success": true,
          "data": {
            "companys": [
              {
                "company_id": "comp_789012",
                "invoice_type": "simples_nacional",
                "token": "eyJhbGciOiJIUzI1NiIs...",
                "cnpj": "12345678000199",
                "name": "Empresa Exemplo LTDA",
                "ie": "123456789",
                "unit": "UN",
                "email": "contacto@empresa.com",
                "cep": "01001000",
                "address": "Calle Ejemplo",
                "house_number": "100",
                "town": "Centro",
                "city": "São Paulo",
                "state": "SP",
                "cert_file": "https://ejemplo.com/cert.pfx",
                "cert_pwd": "***",
                "serie": 1,
                "number": 142
              }
            ],
            "page": 1,
            "total": 8,
            "total_pages": 1
          }
        }
GET /api/company/get_detail
Detalles de la empresa autenticada

Devuelve los datos completos de la empresa identificada por el header token, incluida la lista de categorías fiscales registradas. No acepta body ni query string.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5
timestampstringUnix timestamp en segundos

Ejemplo de llamada

GET /api/company/get_detail

Respuesta

        {
          "success": true,
          "data": {
            "company_id": "comp_789012",
            "name": "Empresa Exemplo LTDA",
            "token": "eyJhbGciOiJIUzI1NiIs...",
            "invoice_type": "simples_nacional",
            "cnpj": "12345678000199",
            "ie": "123456789",
            "unit": "UN",
            "email": "contacto@empresa.com",
            "cep": "01001000",
            "address": "Calle Ejemplo",
            "house_number": "100",
            "town": "Centro",
            "city": "São Paulo",
            "state": "SP",
            "cert_file": "https://ejemplo.com/cert.pfx",
            "cert_pwd": "***",
            "serie": 1,
            "number": 142,
            "categorys": [
              {
                "category_id": "cat_001",
                "descricao": "Venda de mercadoria",
                "disable_difal": false,
                "desconta_icms_pis_cofins": false
              }
            ]
          }
        }
GET /api/category/get_list
Listar categorías de productos

Retorna todas las categorías disponibles para clasificación fiscal.

POST /api/invoice/create
Emitir nueva factura

Emite una NF-e (modelo 55). La empresa emisora se identifica mediante el header token; no envíe company_id en el cuerpo.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Body — campos de nivel superior

CampoTipoDescripción
Identificación y operación
idstringID único del cliente para idempotencia (compone la clave de deduplicación)
nature_of_operation *stringNaturaleza de la operación (ej.: "Venta de mercancía")
transaction_type *stringTipo: "0"=entrada, "1"=salida, "2"=importación, "3"=exportación
model *stringModelo del documento: "55"=NF-e
issuance_type *stringTipo de emisión ("1"=normal, "9"=contingencia, etc.)
ambiente *string"1"=producción, "2"=homologación
finalidadestringFinalidad: "1"=normal, "2"=complementaria, "3"=ajuste, "4"=devolución
ref_nfe_chavestringClave de acceso de 44 dígitos de la NF-e referenciada (complementaria/ajuste/devolución)
is_reopenbooleanReabrir/sobrescribir una NF-e ya emitida
dh_sai_entstringFecha/hora de salida o entrada (ISO 8601). Por defecto: timestamp actual
Importes y descuentos
total_discount_amountdecimalDescuento total de la factura
trocodecimalVuelto (típico en NFC-e)
segurodecimalImporte de seguro (prorrateado entre productos como vSeg en XML)
outras_despesasdecimalOtros gastos (prorrateados entre productos como vOutro en XML)
Indicadores e información adicional
ind_finalstringConsumidor final: "0"=B2B, "1"=B2C
ind_presstringIndicador de presencia: "1"=presencial, "2"=internet, "3"=tele-atención, etc.
informacoes_complementaresstringInformación complementaria (escrita en infAdic.infCpl)
informacoes_fiscostringInformación para el fisco (escrita en infAdic.infAdFisco)

Body — cliente (objeto, obligatorio)

Para operaciones nacionales (transaction_type 0 o 1): cpf o cnpj, name, endereco, bairro (mín. 2 caracteres), city, uf y cep son obligatorios. Para importación/exportación (transaction_type 2 o 3): solo name es obligatorio.
CampoTipoDescripción
cpfstringCPF del cliente (alternativa a cnpj)
cnpjstringCNPJ del cliente (alternativa a cpf)
iestringInscripción Estatal (Inscrição Estadual)
name *stringRazón social / nombre del cliente
enderecostringDirección (calle)
complementostringComplemento de dirección
numerostringNúmero de dirección
bairrostringBarrio (mínimo 2 caracteres en operaciones nacionales)
citystringCiudad
ufstringEstado (UF) — se sobrescribe con el UF resuelto desde el CEP
cepstringCódigo postal (valida UF y ciudad)
telefonestringTeléfono
emailstringCorreo electrónico
id_estrangeirostringID extranjero (uso en importación/exportación)
c_paisintCódigo BACEN del país. Por defecto: 1058 (Brasil)
x_paisstringNombre del país. Por defecto: "BRASIL"

Body — products[] (array, mínimo 1 elemento)

Cada producto requiere tributación: o bien category_id (referencia a una categoría fiscal pre-registrada), o el objeto impostos/tax_info con la configuración en línea.
CampoTipoDescripción
codigostringCódigo interno del producto
name *stringDescripción del producto (los caracteres CJK se eliminan)
ncm *stringNCM con 8 dígitos
ceststringCódigo CEST (obligatorio cuando aplica ICMS-ST)
gtinstringGTIN / código de barras
gtin_tributavelstringGTIN de la unidad tributable
count *decimalCantidad
unit *stringUnidad comercial (ej.: "UN", "KG", "MT")
unit_price *decimalPrecio unitario
total_price *decimalValor total del ítem
discount_pricedecimalDescuento aplicado al ítem
origem *intOrigen de la mercancía (0=Nacional, 1=Extranjera — importación directa, etc.)
indicador_total *intCompone el total de la NF-e: 0=no, 1=sí
category_idstringID de categoría fiscal pre-registrada (obligatorio si no envía impostos/tax_info)
impostosobjectConfiguración de tributos en línea (alternativa a category_id). Vea la estructura abajo
tax_infoobjectAlias de impostos (misma estructura)
disable_difalbooleanDesactiva el cálculo de DIFAL para este ítem
desconta_icms_pis_cofinsbooleanDescuenta el ICMS de la base de PIS/COFINS solo para este ítem (anula la categoría)
iiobjectImpuesto de Importación — obligatorio para CFOP 3.xxx. Vea la estructura abajo
import_declarationsarrayDeclaraciones de Importación (DI) — obligatorio cuando transaction_type="2". Vea la estructura abajo
nItemPedintÍtem del Pedido de Compra (I61). Número secuencial del ítem dentro del pedido referenciado en xPed (viene de id de raíz). Valores válidos: 1–999999. Default: omitido.

Body — products[].impostos / products[].tax_info

CampoTipoDescripción
industriastringIndustria/alícuota base (alias: aliquota)
icms
icms.codigo_cfopstringCFOP
icms.situacao_tributariastringCST/CSOSN del ICMS
icms.industriastringIndustria ICMS
icms.tipo_pessoastringTipo de persona (PF/PJ)
icms.codigo_beneficio_fiscalstringcBenef (código de beneficio fiscal)
ipi
ipi.codigo_enquadramentostringCódigo de encuadre legal del IPI
ipi.situacao_tributariastringCST IPI
ipi.aliquotastringAlícuota IPI
ipi.tipo_pessoastringTipo de persona
pis
pis.situacao_tributariastringCST PIS
pis.aliquotastringAlícuota PIS
pis.tipo_pessoastringTipo de persona
cofins
cofins.situacao_tributariastringCST COFINS
cofins.aliquotastringAlícuota COFINS
cofins.tipo_pessoastringTipo de persona
is (Impuesto Selectivo)
is.cenariostringEscenario IS
is.situacao_tributariastringCST IS
is.aliquotastringAlícuota IS
is.tipo_pessoastringTipo de persona
ibs_cbs (Reforma Tributaria)
ibs_cbs.situacao_tributariastringCST IBS/CBS
ibs_cbs.tipo_pessoastringTipo de persona
ibs_cbs.classificacao_tributariastringClasificación tributaria IBS/CBS
difal
difal.disable_difalbooleanDesactiva DIFAL para el ítem (alternativa al disable_difal en el producto)

Body — products[].ii (Impuesto de Importación)

CampoTipoDescripción
vBCdecimalBase de cálculo del II
vDespAdudecimalGastos aduaneros
vIIdecimalValor del II
vIOFdecimalValor del IOF

Body — products[].import_declarations[]

CampoTipoDescripción
nDIstringNúmero de DI
dDIstring (date)Fecha de DI
xLocDesembstringLugar de desaduanaje
UFDesembstringUF de desaduanaje
dDesembstring (date)Fecha de desaduanaje
cExportadorstringCódigo del exportador
tpViaTranspintVía de transporte internacional
tpIntermediointTipo de intermediación
vAFRMMdecimalValor del AFRMM
additionsarrayAdiciones de DI (campos: nAdicao, nSeqAdic, cFabricante, vDescDI, nDraw)

Body — shipping_address / delivery_address (objetos, opcionales)

shipping_address es el lugar de recogida (origen físico, si difiere del emisor). delivery_address es el lugar de entrega (destino físico, si difiere del cliente). Cuando están presentes, ambos requieren: cpf o cnpj, name, endereco, bairro (mín. 2 caracteres), city, uf y cep. Ambos objetos tienen la misma estructura.
CampoTipoDescripción
cpfstringCPF (alternativa a cnpj)
cnpjstringCNPJ (alternativa a cpf)
iestringInscripción Estatal
name *stringRazón social / nombre
endereco *stringDirección
complementostringComplemento
numberstringNúmero (atención: el campo es number, no numero)
bairro *stringBarrio
city *stringCiudad
uf *stringEstado
cep *stringCódigo postal
telefonestringTeléfono
emailstringCorreo electrónico

Body — transportation (objeto, opcional)

Si transportation se omite, el sistema asume transport_mode="9" (sin flete).
CampoTipoDescripción
transport_modestringModalidad del flete: "0"=por cuenta del emisor, "1"=por cuenta del destinatario, "2"=por cuenta de terceros, "3"=transporte propio del remitente, "4"=transporte propio del destinatario, "9"=sin flete
freight_amountdecimalValor total del flete
carrier_info — transportista
carrier_info.cpfstringCPF del transportista (alternativa a cnpj)
carrier_info.cnpjstringCNPJ del transportista (alternativa a cpf)
carrier_info.iestringInscripción Estatal
carrier_info.namestringRazón social
carrier_info.enderecostringDirección
carrier_info.citystringCiudad
carrier_info.ufstringEstado
carrier_info.cepstringCódigo postal
vehicle_info — vehículo
vehicle_info.platestringPlaca
vehicle_info.ufstringUF de la placa
vehicle_info.rntcstringRNTC (Registro Nacional de Transportistas de Carga)
trailer_info — remolque (misma estructura que vehicle_info)
trailer_info.platestringPlaca del remolque
trailer_info.ufstringUF
trailer_info.rntcstringRNTC
packages[] — volúmenes
packages[].qtyintCantidad
packages[].gross_weightdecimalPeso bruto
packages[].net_weightdecimalPeso neto
packages[].packaging_typestringEspecie
packages[].numberstringNumeración
packages[].markstringMarca
packages[].sealsarray<string>Precintos
transport_tax_retention_info — retención de ICMS sobre flete
transport_tax_retention_info.freight_service_amountdecimalValor del servicio de transporte
transport_tax_retention_info.tax_basedecimalBase de cálculo de la retención
transport_tax_retention_info.tax_ratedecimalAlícuota de la retención
transport_tax_retention_info.cfopstringCFOP
transport_tax_retention_info.cepstringCódigo postal

Body — pag_info[] (array, opcional)

Si se omite, el sistema asume [{ "payment_method": "01", "payment_indicator": "0" }] (efectivo, al contado).
CampoTipoDescripción
payment_method *stringForma de pago: "01"=efectivo, "02"=cheque, "03"=tarjeta de crédito, "04"=tarjeta de débito, "05"=crédito tienda, "10"=vale alimentación, "11"=vale comida, "15"=boleto, "17"=PIX, "90"=sin pago, "99"=otros
payment_indicator *stringIndicador: "0"=al contado, "1"=a plazo
payment_valuedecimalImporte pagado
card_info — datos de la tarjeta (para payment_method 03/04)
card_info.integration_type *stringTipo de integración de la terminal (obligatorio si card_info está presente)
card_info.brand_code *stringMarca de la tarjeta (obligatorio si card_info está presente)
card_info.acquirer_cnpjstringCNPJ de la adquirente
card_info.authorization_codestringCódigo de autorización

* Campo obligatorio.

Ejemplo simplificado

{
  "nature_of_operation": "Venda de mercadoria",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "2",
  "cliente": {
    "cpf": "12345678909",
    "name": "Cliente Exemplo",
    "endereco": "Rua Exemplo",
    "numero": "100",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01001000",
    "email": "cliente@exemplo.com"
  },
  "products": [
    {
      "codigo": "PROD001",
      "name": "Produto Exemplo",
      "ncm": "85176277",
      "count": 2,
      "unit": "UN",
      "unit_price": 150.00,
      "total_price": 300.00,
      "category_id": "SEU_CATEGORY_ID",
      "origem": 0,
      "indicador_total": 1
    }
  ],
  "pag_info": [
    { "payment_method": "01", "payment_indicator": "0", "payment_value": 300.00 }
  ]
}

Ejemplo completo (todos los campos)

{
  "id": "PEDIDO-2026-0001",
  "nature_of_operation": "Venda de mercadoria",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "2",
  "finalidade": "1",
  "ref_nfe_chave": "",
  "is_reopen": false,
  "dh_sai_ent": "",
  "total_discount_amount": 0.00,
  "troco": 0.00,
  "seguro": 0.00,
  "outras_despesas": 0.00,
  "ind_final": "1",
  "ind_pres": "9",
  "informacoes_complementares": "Entrega via transportadora",
  "informacoes_fisco": "ICMS recolhido conforme legislação",
  "cliente": {
    "cpf": "",
    "cnpj": "12345678000199",
    "ie": "123456789",
    "name": "Cliente Exemplo LTDA",
    "endereco": "Av. Paulista",
    "numero": "1000",
    "complemento": "Sala 200",
    "bairro": "Bela Vista",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01310100",
    "telefone": "11999998888",
    "email": "cliente@exemplo.com",
    "id_estrangeiro": "",
    "c_pais": 1058,
    "x_pais": "BRASIL"
  },
  "shipping_address": {
    "cnpj": "98765432000111",
    "name": "Depósito Origem LTDA",
    "ie": "987654321",
    "endereco": "Rua do Depósito",
    "number": "50",
    "complemento": "Galpão 3",
    "bairro": "Industrial",
    "city": "Guarulhos",
    "uf": "SP",
    "cep": "07000000",
    "telefone": "11988887777",
    "email": "deposito@exemplo.com"
  },
  "delivery_address": {
    "cnpj": "12345678000199",
    "name": "Cliente Exemplo LTDA",
    "ie": "123456789",
    "endereco": "Rua de Entrega",
    "number": "25",
    "complemento": "Loja 2",
    "bairro": "Centro",
    "city": "Campinas",
    "uf": "SP",
    "cep": "13010000",
    "telefone": "11977776666",
    "email": "entrega@exemplo.com"
  },
  "products": [
    {
      "codigo": "PROD001",
      "name": "Notebook Dell",
      "ncm": "84713012",
      "cest": "",
      "gtin": "7891234567890",
      "gtin_tributavel": "7891234567890",
      "count": 2,
      "unit": "UN",
      "unit_price": 3500.00,
      "total_price": 7000.00,
      "discount_price": 0.00,
      "origem": 0,
      "indicador_total": 1,
      "category_id": "TF00001",
      "nItemPed": 1
    },
    {
      "codigo": "PROD002",
      "name": "Mouse sem fio",
      "ncm": "84716053",
      "count": 5,
      "unit": "UN",
      "unit_price": 80.00,
      "total_price": 400.00,
      "origem": 0,
      "indicador_total": 1,
      "nItemPed": 2,
      "impostos": {
        "icms": {
          "codigo_cfop": "5102",
          "situacao_tributaria": "00",
          "industria": "",
          "tipo_pessoa": "juridica",
          "codigo_beneficio_fiscal": ""
        },
        "ipi": {
          "codigo_enquadramento": "999",
          "situacao_tributaria": "99",
          "aliquota": "0.00",
          "tipo_pessoa": "juridica"
        },
        "pis": {
          "situacao_tributaria": "01",
          "aliquota": "0.65",
          "tipo_pessoa": "juridica"
        },
        "cofins": {
          "situacao_tributaria": "01",
          "aliquota": "3.00",
          "tipo_pessoa": "juridica"
        },
        "ibs_cbs": {
          "situacao_tributaria": "000",
          "tipo_pessoa": "juridica",
          "classificacao_tributaria": "000001"
        }
      }
    }
  ],
  "transportation": {
    "transport_mode": "1",
    "freight_amount": 150.00,
    "carrier_info": {
      "cnpj": "11222333000144",
      "ie": "112223334",
      "name": "Transportadora Exemplo LTDA",
      "endereco": "Rod. BR-101, km 50",
      "city": "Santos",
      "uf": "SP",
      "cep": "11000000"
    },
    "vehicle_info": {
      "plate": "ABC1D23",
      "uf": "SP",
      "rntc": "12345"
    },
    "trailer_info": {
      "plate": "DEF4G56",
      "uf": "SP",
      "rntc": "67890"
    },
    "packages": [
      {
        "qty": 3,
        "gross_weight": 12.500,
        "net_weight": 11.000,
        "packaging_type": "CAIXA",
        "number": "001-003",
        "mark": "FRAGIL",
        "seals": ["LACRE001", "LACRE002"]
      }
    ],
    "transport_tax_retention_info": {
      "freight_service_amount": 150.00,
      "tax_base": 150.00,
      "tax_rate": 12.00,
      "cfop": "5932",
      "cep": "11000000"
    }
  },
  "pag_info": [
    {
      "payment_indicator": "1",
      "payment_method": "03",
      "payment_value": 7400.00,
      "card_info": {
        "integration_type": "1",
        "brand_code": "01",
        "acquirer_cnpj": "01234567000189",
        "authorization_code": "AUTH987654"
      }
    }
  ]
}
GET /api/invoice/get_list
Listar NF-e (paginado)

Lista las NF-e de la empresa con paginación. Los parámetros se pasan por query string (no en el body). El filtro de tiempo es opcional, pero si se envía requiere tanto start_create_time como end_create_time.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5 (path incluye la query string)
timestampstringUnix timestamp en segundos

Query string

ParámetroTipoDescripción
page *intNúmero de página (≥ 1)
page_size *intTamaño de página (1–50)
start_create_timelongUnix timestamp en milisegundos — inicio (requiere end_create_time)
end_create_timelongUnix timestamp en milisegundos — fin
statusstringFiltrar por estado (valores: "Authorized", "Canceled", "Processing", "Rejected", etc.)

* Campo obligatorio.

Ejemplo de llamada

GET /api/invoice/get_list?page=1&page_size=20&status=Authorized

Respuesta

        {
          "success": true,
          "data": {
            "list": [
              {
                "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
                "chave": "35210112345678901234567890123456789012345678",
                "status": "Authorized",
                "create": "2024-01-10T10:30:00Z",
                "issue_time": "2024-01-10T10:31:00Z"
              }
            ],
            "page": 1,
            "total": 142,
            "total_pages": 8
          }
        }
GET /api/invoice/get_detail
Consultar detalles de la NF-e

Devuelve los detalles de una NF-e específica por UUID. Incluye URL del XML, URLs del DANFE (completo, simplificado y de etiqueta) y metadatos.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5 (path incluye la query string)
timestampstringUnix timestamp en segundos

Query string

ParámetroTipoDescripción
uuid *stringUUID de la NF-e

* Campo obligatorio.

Ejemplo de llamada

GET /api/invoice/get_detail?uuid=65f8b9a1c2d3e4f5a6b7c8d9

Respuesta

        {
          "success": true,
          "data": {
            "id": "pedido-2024-0001",
            "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
            "chave": "35210112345678901234567890123456789012345678",
            "serie": 1,
            "number": 100,
            "status": "Authorized",
            "total_price": 300.00,
            "xml": "https://oss.example.com/.../chave.xml",
            "danfe": "https://oss.example.com/.../chave.pdf",
            "danfe_simples": "https://oss.example.com/.../chave_simplie.pdf",
            "danfe_etiqueta": "https://oss.example.com/.../chave_etiqueta.pdf",
            "create": "2024-01-10T10:30:00Z",
            "issue_time": "2024-01-10T10:31:00Z"
          }
        }
POST /api/invoice/refresh
Actualizar estado de la factura

Consulta el estado actual de la NF-e en SEFAZ y actualiza el registro local. Útil cuando la emisión quedó en procesamiento o contingencia.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
uuid *stringUUID de la NF-e a consultar

* Campo obligatorio.

Ejemplo de carga útil

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9"
        }
POST /api/invoice/cancel
Cancelar factura

Cancela una NF-e ya autorizada. La justificación enviada a SEFAZ es fija: "Erro no preenchimento da nota fiscal." — no se puede configurar mediante el payload.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
uuid *stringUUID de la NF-e a cancelar (identificador interno devuelto por /api/invoice/create)

* Campo obligatorio.

Ejemplo de carga útil

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9"
        }
POST /api/invoice/invalid
Inutilizar rango de numeración

Inutiliza un rango continuo de numeración de NF-e que nunca fue autorizado (no confundir con cancelación — la cancelación se aplica a facturas ya autorizadas). La operación queda registrada en SEFAZ y es irreversible.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
modelo *stringModelo del documento: "55"=NF-e, "65"=NFC-e. (Atención: el campo es modelo, no model)
ambiente *string"1"=producción, "2"=homologación
serie *intSerie de la numeración a inutilizar
start_number *intNúmero inicial del rango
end_number *intNúmero final del rango
motivo *stringJustificación de la inutilización (mínimo 15 caracteres por exigencia de SEFAZ)

* Campo obligatorio.

Ejemplo de carga útil

        {
          "modelo": "55",
          "ambiente": "2",
          "serie": 1,
          "start_number": 100,
          "end_number": 105,
          "motivo": "Falha no sistema durante a emissao do lote"
        }
POST /api/invoice/get_danfe
Obtener DANFE (PDF) de la NF-e

Devuelve tres URLs del DANFE de una NF-e: el DANFE completo (PDF), el DANFE simplificado en PDF (formato cupón) y el DANFE simplificado en PNG (etiqueta/imagen). Los PDFs se generan bajo demanda a partir del XML autorizado y se cachean en OSS. En llamadas posteriores, si el estado de la factura no cambió, devuelve el caché existente; si el estado cambió (ej.: factura cancelada), los PDFs se regeneran.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Body

CampoTipoDescripción
uuid ⚠stringUUID interno de la NF-e (devuelto por /api/invoice/create)
chave ⚠stringClave de acceso de la NF-e (44 dígitos)

uuid o chave, uno de los dos es obligatorio.

Ejemplo de payload

                {
                  "uuid": "abc123-def456-..."
                }

Respuesta

                {
                  "success": true,
                  "data": {
                    "danfe": "https://storage.../uid/dd-MM-yyyy/companyId/.pdf",
                    "danfe_simples": "https://storage.../uid/cnpj/dd-MM-yyyy/_simplie.pdf",
                    "danfe_simples_png": "https://storage.../uid/cnpj/dd-MM-yyyy/_simplie.png"
                  }
                }

Campos de la respuesta

CampoTipoDescripción
danfestringURL del PDF del DANFE completo (formato A4)
danfe_simplesstringURL del PDF del DANFE simplificado (formato cupón)
danfe_simples_pngstringURL del PNG del DANFE simplificado (etiqueta/imagen)

Respuestas de error

MensajeCausa
uuid/chave不能为空Ni uuid ni chave fueron enviados
发票不存在Factura no encontrada para el usuario del token, o XML autorizado faltante
发票详情不存在Detalle de la factura (con protocolo) no encontrado
获取PDF失败:<motivo>Fallo al generar el PDF a partir del XML
POST /api/invoice/get_xml
Exportar XML/Excel en lote (asíncrono)

Inicia una tarea asíncrona de exportación en lote de las facturas del usuario, filtrando por período y estado. Puede generar una hoja Excel (solo metadatos) o un paquete ZIP con los XMLs. La primera llamada crea la tarea y devuelve status: "Processing"; llamadas posteriores con los mismos parámetros devuelven el progreso hasta status: "Success", cuando el campo url contiene el enlace de descarga.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
type *stringFormato de salida: "excel" (hoja de metadatos) o cualquier otro valor (ej.: "xml") para ZIP con XMLs
statusstringFiltra por estado de la factura (ej.: "Success", "Canceled", "Voided"). Para type=excel, se convierte a minúsculas
monthintMes (1–12). Si se informa, sustituye start_create_time/end_create_time; usa zona horaria America/Sao_Paulo y año actual (o anterior si el mes es futuro)
start_create_timelongInicio del período (Unix timestamp en milisegundos)
end_create_timelongFin del período (Unix timestamp en milisegundos)

* Campo obligatorio.

Ejemplo de payload

                {
                  "type": "xml",
                  "status": "Success",
                  "month": 5
                }

Respuesta — procesando

                {
                  "success": true,
                  "data": {
                    "status": "Processing",
                    "progress_count": 120,
                    "total_count": 543,
                    "url": ""
                  }
                }

Respuesta — concluido

                {
                  "success": true,
                  "data": {
                    "status": "Success",
                    "progress_count": 543,
                    "total_count": 543,
                    "url": "https://storage.../exports/uid/.zip"
                  }
                }

Campos de la respuesta

CampoTipoDescripción
statusstring"Processing" mientras se ejecuta, "Success" cuando el archivo está listo
progress_countintCantidad de facturas ya procesadas
total_countintTotal de facturas a procesar
urlstringURL de descarga del archivo final (vacío mientras status = Processing)
Idempotencia: las tareas se deduplican por hash de los parámetros (uid + token + período + status + type). Llamadas repetidas con los mismos parámetros devuelven el progreso de la misma tarea, sin disparar nuevas ejecuciones.

Respuestas de error

MensajeCausa
发票类型字段不能为空type ausente
POST /api/invoice/consultar_status
Consultar estado de la NF-e/NFC-e en SEFAZ

Consulta el estado actual de una NF-e o NFC-e directamente en SEFAZ usando la clave de acceso (44 dígitos), vía el servicio NfeConsultaProtocolo4. Funciona tanto para facturas propias (emitidas por la empresa del token) como para facturas de terceros (ej.: capturadas vía DistDFe). El modelo (NF-e/NFC-e) se detecta automáticamente desde las posiciones 20-21 de la clave.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa (cuyo certificado se usará en la consulta)
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Body

CampoTipoDescripción
chave *stringClave de acceso (44 dígitos numéricos). UF del emisor se extrae de las posiciones 0-1; modelo de las posiciones 20-21 (55=NF-e, 65=NFC-e).

* Campo obligatorio.

Ejemplo de carga útil

        {
          "chave": "35260512345678000199550010000000011000000018"
        }

Respuesta

        {
          "success": true,
          "message": "Sucesso",
          "data": {
            "chave": "35260512345678000199550010000000011000000018",
            "status": "autorizada",
            "cstat": 100,
            "motivo": "Autorizado o uso da NF-e"
          }
        }

Campos de la respuesta

CampoTipoDescripción
chavestringClave de acceso consultada
statusstringEstado normalizado (ver tabla abajo)
cstatintCódigo cStat bruto de SEFAZ
motivostringMensaje xMotivo bruto de SEFAZ

Mapeo de estados

statuscStat de SEFAZSignificado
autorizada100, 150NF-e autorizada para uso
cancelada101, 151Cancelada (también devuelto si hay un evento de cancelación vinculado, incluso con cStat=100)
denegada110, 301, 302Uso denegado por SEFAZ
inutilizada102Número inutilizado (rango de numeración)
nao_encontrada217NF-e no consta en la base de SEFAZ
desconhecidootroscStat no mapeado — consulte cstat y motivo brutos

Respuestas de error

MensajeCausa
chave inválida: deve ter 44 dígitosClave ausente, con tamaño diferente de 44 o conteniendo caracteres no numéricos
empresa não possui certificado configuradoLa empresa del token no tiene cert_file registrado
SEFAZ retornou resposta vaziaSEFAZ no devolvió respuesta (timeout, fuera del aire)
erro ao consultar SEFAZ: <detalle>Excepción al llamar al servicio (XML inválido, timeout, certificado expirado, etc.)
POST /api/category/create
Crear categoría fiscal

Crea una nueva categoría fiscal (plantilla de impuestos) vinculada a la empresa autenticada. Cada categoría agrega escenarios de ICMS, IPI, PIS, COFINS, y opcionalmente IBS/CBS e IS. Para editar una existente, use /api/category/edit.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body — nivel superior

CampoTipoDescripción
descricao *stringDescripción de la categoría fiscal
category_idstringID personalizado. Si se omite, se genera automáticamente como "TF" + número incremental
disable_difalbooleanDesactiva el cálculo de DIFAL para esta categoría. Default: false
desconta_icms_pis_cofinsbooleanDescuenta el ICMS de la base de cálculo de PIS/COFINS (base = vProd − vICMS). Default: false
icms[] *arrayEscenarios ICMS (estructura abajo)
ipi[] *arrayEscenarios IPI (estructura abajo)
pis[] *arrayEscenarios PIS (estructura abajo)
cofins[] *arrayEscenarios COFINS (estructura abajo)
ibs_cbs[]arrayEscenarios IBS/CBS — reforma tributaria (estructura abajo)
is[]arrayEscenarios IS — Impuesto Selectivo (estructura abajo)

Body — icms[]

CampoTipoDescripción
tipo_tributacao *stringTipo de tributación ICMS
cenario *stringEscenario (ej.: "saida_dentro_estado", "saida_fora_estado", "padrao")
tipo_pessoa *string"fisica" o "juridica"
codigo_cfop *stringCFOP
situacao_tributaria *stringCST/CSOSN del ICMS
nao_contribuintebooleanCliente no-contribuyente
aliquota_importacaostringAlícuota de importación
aliquota_creditodecimalAlícuota de crédito (% para Simples Nacional)
aliquota_diferimentodecimalPorcentaje de diferimiento
aliquota_diferimentoFcpstringDiferimiento de FCP (atención: el campo usa camelCase diferimentoFcp)
aliquota_reducaodecimalPorcentaje de reducción de base ICMS
aliquota_reducaoStdecimalPorcentaje de reducción de base ICMS-ST (atención: reducaoSt camelCase)
motivo_desoneracaostringCódigo del motivo de exoneración ICMS
motivo_desoneracaoStstringCódigo del motivo de exoneración ICMS-ST (atención: camelCase)
Alícuotas por estado — opcional
aliquota_mva[]arrayMVA por UF — ítems: { estado, aliquota }
aliquota_icms[]arrayAlícuota ICMS por UF — ítems: { estado, aliquota }
aliquota_icms_st[]arrayAlícuota ICMS-ST por UF — ítems: { estado, aliquota }
aliquota_fcp[]arrayAlícuota FCP por UF — ítems: { estado, aliquota }
aliquota_fcp_st[]arrayAlícuota FCP-ST por UF — ítems: { estado, aliquota }
beneficio_fiscal[]arrayCódigo de beneficio fiscal por UF — ítems: { estado, codigo }

Body — ipi[]

CampoTipoDescripción
cenario *stringEscenario
tipo_pessoa *string"fisica" o "juridica"
situacao_tributaria *stringCST IPI
codigo_enquadramento *stringCódigo de encuadre legal
aliquota *stringAlícuota IPI

Body — pis[] y cofins[] (misma estructura)

CampoTipoDescripción
cenario *stringEscenario
tipo_pessoa *string"fisica" o "juridica"
situacao_tributaria *stringCST PIS/COFINS
aliquota *stringAlícuota

Body — ibs_cbs[] (Reforma Tributaria)

CampoTipoDescripción
cenario *stringEscenario
tipo_pessoa *string"fisica" o "juridica"
situacao_tributaria *stringCST IBS/CBS
classificacao_tributaria *stringClasificación tributaria

Body — is[] (Impuesto Selectivo)

CampoTipoDescripción
cenario *stringEscenario
tipo_pessoa *string"fisica" o "juridica"
situacao_tributaria *stringCST IS
aliquota *stringAlícuota IS

* Campo obligatorio.

Ejemplo mínimo

        {
          "descricao": "Venda de mercadoria padrão",
          "icms": [{
            "tipo_tributacao": "normal",
            "cenario": "padrao",
            "tipo_pessoa": "juridica",
            "codigo_cfop": "5102",
            "situacao_tributaria": "00"
          }],
          "ipi":  [{ "cenario": "padrao", "tipo_pessoa": "juridica", "situacao_tributaria": "99", "codigo_enquadramento": "999", "aliquota": "0" }],
          "pis":  [{ "cenario": "padrao", "tipo_pessoa": "juridica", "situacao_tributaria": "01", "aliquota": "0.65" }],
          "cofins":[{ "cenario": "padrao", "tipo_pessoa": "juridica", "situacao_tributaria": "01", "aliquota": "3" }]
        }

Respuesta

        {
          "success": true,
          "data": {
            "category_id": "TF123"
          }
        }
GET /api/category/get_detail
Detalles de la categoría fiscal

Devuelve la configuración completa de una categoría fiscal: todos los escenarios de ICMS, IPI, PIS, COFINS, IBS/CBS, incluidas las matrices por UF (MVA, alícuotas, beneficios fiscales).

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5 (path incluye la query string)
timestampstringUnix timestamp en segundos

Query string

ParámetroTipoDescripción
category_id *stringID de la categoría fiscal

* Campo obligatorio.

Ejemplo de llamada

GET /api/category/get_detail?category_id=TF123

Respuesta

        {
          "success": true,
          "data": {
            "category_id": "TF123",
            "descricao": "Venda de mercadoria padrão",
            "disable_difal": false,
            "desconta_icms_pis_cofins": false,
            "icms": [{
              "tipo_tributacao": "normal",
              "cenario": "padrao",
              "tipo_pessoa": "juridica",
              "nao_contribuinte": false,
              "codigo_cfop": "5102",
              "situacao_tributaria": "00",
              "aliquota_importacao": "",
              "aliquota_credito": 0,
              "aliquota_reducao": 0,
              "aliquota_reducao_st": 0,
              "motivo_desoneracao": "",
              "motivo_desoneracao_st": "",
              "aliquota_icms": [{"estado":"SP","aliquota":18}]
            }],
            "ipi":    [{"cenario":"padrao","tipo_pessoa":"juridica","situacao_tributaria":"99","codigo_enquadramento":"999","aliquota":"0"}],
            "pis":    [{"cenario":"padrao","tipo_pessoa":"juridica","situacao_tributaria":"01","aliquota":"0.65"}],
            "cofins": [{"cenario":"padrao","tipo_pessoa":"juridica","situacao_tributaria":"01","aliquota":"3"}],
            "ibs_cbs":[]
          }
        }
GET /api/category/get_list
Listar categorías fiscales

Lista las categorías fiscales de la empresa autenticada con paginación. Devuelve solo category_id y descricao de cada una — use /api/category/get_detail para la configuración completa.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5 (path incluye la query string)
timestampstringUnix timestamp en segundos

Query string

ParámetroTipoDescripción
page *intNúmero de página (≥ 1)
page_size *intTamaño de página (1–50)

* Campo obligatorio.

Ejemplo de llamada

GET /api/category/get_list?page=1&page_size=20

Respuesta

        {
          "success": true,
          "data": {
            "list": [
              { "category_id": "TF123", "descricao": "Venda de mercadoria padrão" },
              { "category_id": "TF124", "descricao": "Devolução de venda" }
            ],
            "page": 1,
            "total": 2,
            "total_pages": 1
          }
        }
POST /api/category/edit
Editar categoría fiscal

Edita una categoría fiscal existente. El cuerpo es idéntico al de /api/category/create, con la única diferencia de que category_id es obligatorio y debe corresponder a una categoría existente. El upsert reemplaza completamente las matrices icms, ipi, pis, cofins, ibs_cbs, is — envíe todos los escenarios actualizados (no hay merge por escenario).

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

La estructura completa del body está documentada en /api/category/create. Solo category_id tiene un tratamiento diferente aquí:

CampoTipoDescripción
category_id *stringID de la categoría a editar (debe existir; en caso contrario devuelve error)
descricao *stringDescripción
icms[] *arrayEscenarios ICMS (reemplaza completamente)
ipi[] *arrayEscenarios IPI
pis[] *arrayEscenarios PIS
cofins[] *arrayEscenarios COFINS
ibs_cbs[]arrayEscenarios IBS/CBS (opcional)
is[]arrayEscenarios IS (opcional)
disable_difalbooleanDefault: false
desconta_icms_pis_cofinsbooleanDefault: false

* Campo obligatorio. Para los campos internos de cada array (icms[].codigo_cfop etc.), vea /api/category/create.

Respuesta

        {
          "success": true,
          "data": {
            "category_id": "TF123"
          }
        }
POST /api/category/delete
Eliminar categoría fiscal

Elimina una categoría fiscal de la empresa. Operación irreversible. Los productos vinculados a esta categoría seguirán referenciando el category_id eliminado, por lo que la emisión de NFe fallará — actualice los productos antes de eliminar.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
category_id *stringID de la categoría a eliminar

* Campo obligatorio.

Ejemplo de carga útil

        {
          "category_id": "TF123"
        }

Respuesta

        {
          "success": true
        }
GET /api/company/get_cep_detail
Consultar dirección por CEP

Resuelve un CEP brasileño devolviendo UF, código IBGE del municipio y datos de la dirección. Útil para rellenar direcciones de empresas y clientes. Requiere cuenta de distribuidor (b2b).

Headers obligatorios

HeaderTipoDescripción
tokenstringToken del distribuidor (b2b — la cuenta debe tener isb2b=true)
signstringFirma MD5 (path incluye la query string)
timestampstringUnix timestamp en segundos

Query string

ParámetroTipoDescripción
cep *stringCEP brasileño (8 dígitos, con o sin guion)

* Campo obligatorio.

Ejemplo de llamada

GET /api/company/get_cep_detail?cep=01001000

Respuesta

        {
          "success": true,
          "data": {
            "cep": "01001-000",
            "uf": "SP",
            "ibge": 3550308,
            "logradouro": "Praça da Sé",
            "bairro": "Sé",
            "localidade": "São Paulo",
            "ddd": "11"
          }
        }
GET /api/company/get_export_invoice_month_files
Listar archivos de exportación mensual ya generados

Devuelve la lista de archivos de exportación mensual ya generados para la empresa en el año actual (timezone America/Sao_Paulo). Cada mes puede tener hasta 4 archivos: 1 planilla Excel (solo estado Success) + 3 XMLs (por estado Success, Canceled y Voided). Solo aparecen los archivos efectivamente exportados — use /api/invoice/get_xml para generar nuevos.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5
timestampstringUnix timestamp en segundos

Ejemplo de llamada

GET /api/company/get_export_invoice_month_files

Respuesta

CampoTipoDescripción
files[]arrayLista de archivos disponibles
files[].urlstringURL del archivo en OSS
files[].yearintAño del periodo
files[].monthstringMes (1–12)
files[].typestringTipo de archivo: "xlsx" o "xml"
files[].statusstringEstado de las facturas en el archivo: "Success", "Canceled" o "Voided"
files[].createdatetimeCuándo se generó el archivo

Ejemplo de respuesta

        {
          "success": true,
          "data": {
            "files": [
              {
                "url": "https://oss.example.com/.../2024_01_success.xlsx",
                "year": 2024,
                "month": "1",
                "type": "xlsx",
                "status": "Success",
                "create": "2024-02-01T03:15:00Z"
              },
              {
                "url": "https://oss.example.com/.../2024_01_success.zip",
                "year": 2024,
                "month": "1",
                "type": "xml",
                "status": "Success",
                "create": "2024-02-01T03:15:30Z"
              }
            ]
          }
        }
POST /api/invoice/return
Emitir NF-e de devolución

Emite una NF-e de devolución (modelo 55, finalidad 4) a partir de una NF-e original. Se admiten dos modos: devolución total (referencia la factura original mediante uuid o chave) o devolución parcial/personalizada (envía el cuerpo completo mediante return_detail).

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body — campos de nivel superior

CampoTipoDescripción
uuidstringUUID de la NF-e original (obligatorio si chave está ausente; no se usa en modo return_detail)
chavestringClave de 44 dígitos de la NF-e original (obligatorio en modo return_detail; alternativa a uuid en modo simple)
cfop *stringCFOP de la devolución (ej.: "1202", "1411", "2202", "5202", "5411", "6202")
natureza_operacaostringNaturaleza de la operación (ej.: "Devolución de venta"). Alias aceptado: nature_of_operation
return_detailobjectCuerpo completo de la NF-e de devolución. Misma estructura que /api/invoice/create, con una particularidad: dentro de return_detail.cliente el campo del número de dirección es number (en inglés), no numero. Cuando está ausente, la devolución es total y clona la NF-e original.

* Campo obligatorio. uuid O chave también es obligatorio (exactamente uno).

Ejemplo — devolución total

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
          "cfop": "5202",
          "natureza_operacao": "Devolución de venta"
        }

Ejemplo — devolución parcial vía return_detail

        {
          "chave": "35210112345678901234567890123456789012345678",
          "cfop": "5202",
          "natureza_operacao": "Devolución parcial",
          "return_detail": {
            "nature_of_operation": "Devolución parcial",
            "transaction_type": "1",
            "model": "55",
            "issuance_type": "1",
            "ambiente": "2",
            "cliente": { "cnpj": "12345678000199", "name": "Fornecedor", "endereco": "...", "bairro": "...", "city": "...", "uf": "SP", "cep": "01001000" },
            "products": [ { "name": "...", "ncm": "...", "count": 1, "unit": "UN", "unit_price": 100, "total_price": 100, "category_id": "...", "origem": 0, "indicador_total": 1 } ]
          }
        }

code Ejemplos Completos de Emisión de Factura

Ejemplo Completo con Transporte

{
  "nature_of_operation": "Venta de mercancía",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "2",
  "ind_final": "0",
  "ind_pres": "1",
  "cliente": {
    "cnpj": "12345678000199",
    "ie": "123456789",
    "name": "Empresa Cliente Ltda",
    "endereco": "Calle Ejemplo",
    "number": "123",
    "complemento": "Sala 45",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01234567",
    "telefone": "11999999999",
    "email": "contacto@empresa.com"
  },
  "products": [
    {
      "codigo": "PROD001",
      "name": "Smartphone XYZ",
      "ncm": "85171210",
      "cest": "2804000",
      "count": 2,
      "unit": "UN",
      "unit_price": 1500.00,
      "total_price": 3000.00,
      "category_id": "SU_CATEGORY_ID",
      "origem": "0",
      "indicador_total": "1"
    }
  ],
  "transportation": {
    "transport_mode": "0",
    "freight_amount": 30.00,
    "carrier_info": {
      "cnpj": "12345678000188",
      "name": "Transportadora Expressa",
      "endereco": "Calle de la Transportadora",
      "city": "São Paulo",
      "uf": "SP"
    },
    "vehicle_info": {
      "plate": "ABC1234",
      "uf": "SP",
      "rntc": "123456"
    },
    "packages": [
      {
        "qty": 1,
        "packaging_type": "CX",
        "gross_weight": 2.500,
        "net_weight": 2.000
      }
    ]
  },
  "shipping_address": {
    "cnpj": "12345678000199",
    "name": "Remetente Ltda",
    "endereco": "Calle del Remitente",
    "number": "100",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01001000"
  },
  "delivery_address": {
    "cnpj": "98765432000111",
    "name": "Destinatário Ltda",
    "endereco": "Calle del Destinatario",
    "number": "200",
    "bairro": "Centro",
    "city": "Rio de Janeiro",
    "uf": "RJ",
    "cep": "20040020"
  },
  "pag_info": [
    {
      "payment_method": "03",
      "payment_indicator": "0",
      "card_info": {
        "integration_type": "1",
        "brand_code": "01"
      }
    }
  ],
  "informacoes_complementares": "Sem informações adicionais",
  "informacoes_fisco": "ICMS recolhido conforme legislação"
}
💡 INFORMACIÓN: Este ejemplo incluye todos los campos importantes mencionados en las capturas de pantalla, incluyendo transporte, información fiscal detallada y pago. Adapte los valores según su necesidad específica.

Ejemplo Completo Importación

{
  "id": "PED-IMP-001",
  "nature_of_operation": "Importacao para revenda",
  "transaction_type": "2",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "1",
  "finalidade": "1",
  "ind_final": "0",
  "ind_pres": "9",
  "cliente": {
    "name": "EXPORTADOR EXTERIOR CO LTD",
    "endereco": "Pudong District",
    "numero": "456",
    "city": "Shanghai",
    "id_estrangeiro": "CN-EXP-001",
    "c_pais": 1600,
    "x_pais": "CHINA"
  },
  "products": [
    {
      "name": "Fonte chaveada 12V 2A Quickfitting",
      "codigo": "123450000888",
      "ncm": "85044090",
      "count": 2,
      "unit": "PC",
      "unit_price": 0.25,
      "total_price": 0.50,
      "origem": 1,
      "indicador_total": "1",
      "category_id": "SU_CATEGORY_ID",
      "import_declarations": [
        {
          "nDI": "2312345678",
          "dDI": "2026-04-12",
          "xLocDesemb": "PORTO DE SANTOS",
          "UFDesemb": "SP",
          "dDesemb": "2026-04-15",
          "tpViaTransp": 1,
          "vAFRMM": 0.01,
          "tpIntermedio": 1,
          "cExportador": "EXP-CN-001",
          "additions": [
            {
              "nAdicao": 1,
              "nSeqAdic": 1,
              "cFabricante": "FAB-CN-001",
              "vDescDI": 0,
              "nDraw": ""
            }
          ]
        }
      ]
    },
    {
      "name": "Quick fitting MA",
      "codigo": "123450000157",
      "ncm": "85044090",
      "count": 2,
      "unit": "PC",
      "unit_price": 0.25,
      "total_price": 0.50,
      "origem": 1,
      "indicador_total": "1",
      "category_id": "SU_CATEGORY_ID",
      "ii": {
        "vBC": 0.50,
        "vDespAdu": 0.00,
        "vII": 0.00,
        "vIOF": 0.00
      },
      "import_declarations": [
        {
          "nDI": "2312345678",
          "dDI": "2026-04-12",
          "xLocDesemb": "PORTO DE SANTOS",
          "UFDesemb": "SP",
          "dDesemb": "2026-04-15",
          "tpViaTransp": 1,
          "vAFRMM": 1.00,
          "tpIntermedio": 1,
          "cExportador": "EXP-CN-001",
          "additions": [
            {
              "nAdicao": 1,
              "nSeqAdic": 2,
              "cFabricante": "FAB-CN-001",
              "vDescDI": 0,
              "nDraw": ""
            }
          ]
        }
      ]
    }
  ],
  "pag_info": [
    {
      "payment_method": "90",
      "payment_indicator": "0"
    }
  ]
}
💡 INFORMACIÓN: Ejemplo para NFe de Importación (CFOP 3.xxx). Diferencias respecto a una NFe nacional:
  • transaction_type: "2" — operación de entrada (importación).
  • cliente sin cnpj/cpf/uf/cep; usa id_estrangeiro, c_pais (tabla BACEN — China = 1600) y x_pais.
  • category_id debe apuntar a una categoría fiscal con CFOP 3.xxx y CST/CSOSN compatibles con importación.
  • origem del producto = 1 (extranjera — importación directa) o 2 (extranjera — adquirida en el mercado interno).
  • El bloque ii (Impuesto de Importación) es obligatorio cuando el CFOP es 3.xxx. Los valores provienen de la DI emitida por el despachante aduanero (vBC, vDespAdu, vII, vIOF). Puede ser cero en pruebas.
  • El bloque import_declarations (Declaración de Importación) contiene datos del despacho aduanero: nDI, dDI, lugar/UF/fecha de despacho, vía de transporte, intermediario, exportador y adiciones.
  • vAFRMM es obligatorio cuando tpViaTransp = 1 (Marítima).

vpn_key Autenticación

Todas las peticiones deben incluir los siguientes headers:

Header Tipo Obligatorio Descripción
Content-Type string application/json;charset=utf-8
sign string Firma digital de la petición
timestamp string Timestamp UTC de la petición
token string Token de autenticación

Observación: Para crear empresa y obtener lista de empresas, use el token del distribuidor (b2b_token).

Algoritmo de Firma (SIGN)

static string GetSign(string AppKey, string Path, string bodyString, string timestamp)
{
    string input = AppKey + Path + bodyString + timestamp;
    using (MD5 md5 = MD5.Create())
    {
        byte[] inputBytes = Encoding.UTF8.GetBytes(input);
        byte[] hashBytes = md5.ComputeHash(inputBytes);
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hashBytes.Length; i++)
        {
            sb.Append(hashBytes[i].ToString("x2"));
        }
        return sb.ToString();
    }
}
Importante: Al calcular el sign, el Path incluye la query string para solicitudes GET. Ejemplo: /api/nfce/category/get_detail?category_id=TF123. Para solicitudes POST, el Path es solo la ruta (ej: /api/company/create).

percent Parámetros Tributarios Detallados

scale_balance Parámetros ICMS
Escenario de Tributación
padrao salida_fuera_estado salida_dentro_estado entrada_fuera_estado entrada_dentro_estado
Situación Tributaria (CST)
00: Tributada integralmente
02: Tributada exenta
10: Tributada con cobro del ICMS
20: Con reducción de base de cálculo
30: Exenta o no tributada
40: Exenta
41: No tributada
50: Suspensión
51: Diferimiento
60: ICMS cobrado anteriormente
70: Reducción y cobro
90: Otras
pie_chart Parámetros PIS/COFINS
Escenario de Tributación
padrao salida_fuera_estado salida_dentro_estado entrada_fuera_estado entrada_dentro_estado
Situación Tributaria (CST)
01: Operación Tributable (alícuota normal)
02: Operación Tributable (alícuota diferenciada)
03: Operación Tributable (exenta)
04: Operación Tributable (suspensión)
05: Operación Tributable (ST)
06: Operación Tributable (alícuota cero)
07: Operación Exenta de la Contribución
08: Operación sin Incidencia de la Contribución
09: Operación con Suspensión de la Contribución
49: Otras Operaciones de Salida
50: Derecho a crédito (operaciones propias)
51: Derecho a crédito (adquisiciones)
52: Asiento a crédito
53: Asiento a débito
54: Asiento a crédito (extemporáneo)
55: Asiento a débito (extemporáneo)
56: Crédito Presunto
60: Crédito Presunto (adquisiciones)
61: Crédito Presunto (importación)
62: Crédito Presunto (actividad rural)
63: Crédito Presunto (otras)
64: Crédito Presunto (no generador)
65: Crédito Presunto (sustitución)
66: Crédito Presunto (sustitución)
67: Crédito Presunto (exportación)
70: Operación de Adquisición sin Derecho a Crédito
71: Operación de Adquisición con Exención
72: Operación de Adquisición con Suspensión
73: Operación de Adquisición a Alícuota Cero
74: Operación de Adquisición sin Incidencia
75: Operación de Adquisición por Sustitución
98: Otras Operaciones de Entrada
99: Otras Operaciones
💡 INFORMACIÓN: Los campos tipo_pessoa aceptan valores fisica (persona física) o juridica (persona jurídica). Para PIS/COFINS, el campo aliquota debe ser formateado como string con dos decimales (ej: "1.65").

credit_card Parámetros de Pago

Indicador de Pago
0 Al contado
1 A plazos
Métodos de Pago
01 Efectivo
02 Cheque
03 Tarjeta de Crédito
04 Tarjeta de Débito
05 Crédito Tienda
10 Vale Alimentación
11 Vale Comida
12 Vale Regalo
13 Vale Combustible
15 Boleto Bancario
90 Sin Pago
99 Otros
Banderas de Tarjeta
01 Visa
02 Mastercard
03 American Express
04 Sorocred
05 Diners Club
06 Elo
07 Hipercard
08 Aura
09 Cabal
99 Otros

bug_report Solución de Problemas con XML

warning Rechazo 225 - Fallo en el Schema XML

Ocurre cuando intenta cancelar, descargar XML, inutilizar número o hacer manifestación de una NF-e que no fue registrada con éxito en la base de datos de la SEFAZ.

1
Verificar si la NF-e fue autorizada (estado "Autorizada")
2
Reemitir la NF-e si no fue autorizada
3
Inutilizar número si no fue utilizado
lightbulb Validación Online de la SEFAZ

Use el validador oficial para identificar problemas en el XML:

https://www.sefaz.rs.gov.br/nfe/nfe-val.aspx

Problemas comunes: Dirección incompleta, NCM inválido, formato de valores incorrecto, campos obligatorios ausentes.

error Códigos de Error de la SEFAZ

Código Descripción Solución
217 Fecha de emisión muy atrasada Emitir en contingencia o regularizar
404 CNPJ/CPF del destinatario inválido Verificar documento del cliente
563 CFOP no permitido para la operación Revisar CFOP de la operación

Otros Endpoints

4. Listar Categorías: GET /api/category/get_list
5. Detalles de la Categoría: GET /api/category/get_detail
6. Editar Categoría: POST /api/category/edit
7. Eliminar Categoría: POST /api/category/delete
Ejemplos de CFOP (Código Fiscal de Operaciones):
5102: Venta de mercancía adquirida de terceros - dentro del estado
6102: Venta de mercancía adquirida de terceros - para otro estado
6108: Venta de mercancía adquirida de terceros - para otro estado (persona física)
1000: Entrada de mercancía
speed

Límites y Rate Limiting

Políticas de uso de la API

Límites por Plan
Plan Free 100 peticiones/día
Plan Basic 1.000 peticiones/día
Plan Pro 10.000 peticiones/día
Plan Enterprise Personalizado
Valores para transport_mode:
0: Contratación del Flete por cuenta del Remitente (CIF)
1: Contratación del Flete por cuenta del Destinatario (FOB)
2: Contratación del Flete por cuenta de Terceros
3: Transporte Propio por cuenta del Remitente
4: Transporte Propio por cuenta del Destinatario
9: Sin Ocurrencia de Transporte
Ejemplos de CFOP (Código Fiscal de Operaciones):
5102: Venta de mercancía adquirida de terceros - dentro del estado
6102: Venta de mercancía adquirida de terceros - para otro estado
6108: Venta de mercancía adquirida de terceros - para otro estado (persona física)
1000: Entrada de mercancía

assessment Informes NFe

Genere informes detallados de las Facturas Electrónicas (NF-e) emitidas, con filtros por período, estado y tipo de operación. Ideal para seguimiento fiscal, auditorías y control gerencial.

1. Informe de Facturas Emitidas

GET /api/invoice/report

Parámetros de Solicitud (Query)

Parámetro Obligatorio Tipo Descripción
company_id String ID de la empresa
start_date Date Fecha de inicio del período (YYYY-MM-DD)
end_date Date Fecha final del período (YYYY-MM-DD)
status No String Filtrar por estado: AUTHORIZED, CANCELED, DENIED, ALL (predeterminado)
model No String Modelo del documento: nfe, nfce, all (predeterminado)
format No String Formato de salida: json (predeterminado), csv, pdf
page No Integer Número de página (predeterminado: 1)
per_page No Integer Registros por página (predeterminado: 50, máx: 200)

Ejemplo de Solicitud

GET /api/invoice/report?company_id=comp_123456&start_date=2024-01-01&end_date=2024-01-31&status=AUTHORIZED&format=json

Ejemplo de Respuesta

{
  "success": true,
  "data": {
    "summary": {
      "total_invoices": 152,
      "total_value": 458320.50,
      "authorized": 145,
      "canceled": 5,
      "denied": 2
    },
    "invoices": [
      {
        "invoice_id": "nf_789012",
        "number": 1045,
        "series": 1,
        "access_key": "35210112345678901234...",
        "status": "AUTHORIZED",
        "issue_date": "2024-01-10T10:30:00Z",
        "total_value": 3000.00,
        "customer_name": "Empresa Cliente Ltda",
        "customer_document": "12.345.678/0001-99",
        "nature_of_operation": "VENDA",
        "model": "nfe"
      }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 50,
      "total_pages": 4,
      "total_records": 152
    }
  }
}

2. Informe Resumido por Período

GET /api/invoice/report/summary

Retorna un resumen consolidado de las operaciones fiscales agrupadas por mes, con totales de valor, cantidad e impuestos.

Parámetros de Solicitud (Query)

Parámetro Obligatorio Tipo Descripción
company_id String ID de la empresa
year Integer Año de referencia (ej: 2024)
group_by No String Agrupar por: month (predeterminado), week, day

Ejemplo de Respuesta

{
  "success": true,
  "data": {
    "company_id": "comp_123456",
    "year": 2024,
    "periods": [
      {
        "period": "2024-01",
        "total_invoices": 152,
        "total_value": 458320.50,
        "total_tax": 82497.69,
        "authorized": 145,
        "canceled": 5,
        "denied": 2
      },
      {
        "period": "2024-02",
        "total_invoices": 178,
        "total_value": 523180.75,
        "total_tax": 94172.54,
        "authorized": 170,
        "canceled": 6,
        "denied": 2
      }
    ]
  }
}

3. Exportar Informe

POST /api/invoice/report/export

Genera y exporta el informe completo en formato PDF o CSV. La exportación se procesa de forma asíncrona y devuelve una URL de descarga cuando se completa.

Payload Request

{
  "company_id": "comp_123456",
  "start_date": "2024-01-01",
  "end_date": "2024-12-31",
  "format": "pdf",
  "status": "ALL",
  "include_details": true,
  "include_taxes": true
}

Ejemplo de Respuesta

{
  "success": true,
  "message": "Informe en procesamiento",
  "data": {
    "report_id": "rpt_abc123",
    "status": "processing",
    "estimated_time": "30s",
    "callback_url": "https://api.tffiscal.com/v1/report/status/rpt_abc123"
  }
}

Respuesta Después del Procesamiento

{
  "success": true,
  "data": {
    "report_id": "rpt_abc123",
    "status": "completed",
    "download_url": "https://storage.tffiscal.com/reports/rpt_abc123.pdf",
    "expires_at": "2024-02-01T23:59:59Z",
    "file_size": "2.4 MB"
  }
}
💡 CONSEJO: Use el parámetro format=csv para integrar los datos con sistemas ERP u hojas de cálculo. El formato PDF es ideal para presentaciones y auditorías fiscales.
⚠️ ATENCIÓN: El período máximo permitido por consulta es de 12 meses. Para informes anuales completos, utilice el endpoint de exportación (/report/export). Las consultas con grandes volúmenes de datos pueden tardar algunos segundos en procesarse.

vpn_key Autenticación Global del TF Hub

Todas las APIs del TF Hub utilizan un sistema unificado de autenticación.

Headers Obligatorios

Header Valor Descripción
X-API-Key String Clave de la API proporcionada en el panel
X-Timestamp Unix Timestamp Timestamp de la petición en milisegundos
X-Signature String Firma HMAC-SHA256

point_of_sale NFC-e — Factura Electrónica de Consumidor

Base URL (Producción)
https://api.tffiscal.com
Autenticación
Headers: sign, timestamp, token
Requisitos
Certificado Digital A1 válido (.pfx o .p12)
CSC (Código de Seguridad del Contribuyente)
CSC ID (Identificador del CSC en SEFAZ)

La NFC-e (modelo 65) es el documento fiscal electrónico para ventas minoristas al consumidor final, ya sea presencial o por entrega a domicilio. Reemplaza el antiguo cupón fiscal (ECF).

Características de la NFC-e:
  • Siempre operación interna (dentro del estado) — sin DIFAL
  • Sin IPI (Impuesto sobre Producto Industrializado)
  • Destinatario opcional para ventas presenciales (ind_pres: "1")
  • Destinatario obligatorio para entregas a domicilio (ind_pres: "4")
  • Requiere CSC (Código de Seguridad del Contribuyente) para generación del código QR

Autenticación

Todos los endpoints NFC-e utilizan la misma autenticación de la API principal:

HeaderTipoDescripción
tokenstringToken de la empresa (obtenido en el registro)
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)
Importante: Al calcular el sign, el path incluye la query string para solicitudes GET. Ejemplo: /api/nfce/category/get_detail?category_id=TF123. Para solicitudes POST, el path es solo la ruta (ej: /api/nfce/company/create).

compare_arrows NFe vs NFC-e — ¿Qué cambia para el integrador?

Si ya ha integrado la NFe (modelo 55), la integración de la NFC-e (modelo 65) es muy similar. A continuación se detallan las diferencias clave que necesita conocer.

apartment Registro de Empresa

AspectoNFe /api/company/createNFC-e /api/nfce/company/create
Campos básicos cnpj, name, alias, ie, invoice_type, dirección, certificado digital Iguales a NFe — mismos campos obligatorios
CSC No se utiliza Obligatoriocsc_id y csc (obtenidos en el portal de la SEFAZ)
Serie / Numeración serie y number serie_nfce y number_nfce — numeración independiente de la NFe
Token retornado Mismo token — si la empresa ya existe, los campos NFC-e se añaden automáticamente
Consejo: Si la empresa ya fue registrada para NFe, simplemente llame a /api/nfce/company/create con el mismo CNPJ. El sistema reconocerá la empresa existente y añadirá los campos NFC-e (CSC, serie, numeración). El token permanece igual.

receipt_long Emisión de Factura

AspectoNFe /api/invoice/createNFC-e /api/nfce/create
Destinatario Siempre obligatorio (CNPJ/CPF, nombre, dirección completa) Opcional para ventas presenciales; obligatorio solo para entrega a domicilio (ind_pres: "4")
Indicador de presencia No se utiliza Obligatorioind_pres: "1" presencial, "4" entrega a domicilio
Impuestos calculados ICMS, PIS, COFINS, IPI, DIFAL (interestatal) ICMS, PIS, COFINS — sin IPI, sin DIFAL (siempre operación interna)
CFOP Varía (5xxx interno, 6xxx interestatal) Siempre 5xxx (operación interna) — ej: 5102
Pago Opcional Obligatoriopag_info con forma de pago (efectivo, PIX, tarjeta, etc.)
Campos del producto Iguales — misma estructura (codigo, name, ncm, count, unit, unit_price, total_price, category_id, cfop, origem)
Cancelación Plazo de 24 horas Plazo de 30 minutos (varía por estado)
DANFE PDF A4 Cupón térmico (rollo 80mm) con código QR
Resumen: Si ya integró la NFe, para integrar la NFC-e solo necesita:
  1. Registrar el CSC de la empresa (/api/nfce/company/create)
  2. Cambiar el endpoint de emisión a /api/nfce/create
  3. Agregar ind_pres y pag_info al payload
  4. Eliminar datos de IPI/DIFAL (si los hay)
POST /api/nfce/company/create
Registrar empresa para NFC-e

Registra (o actualiza) una empresa para la emisión de NFC-e. Razón social, IE, dirección y otros datos se extraen automáticamente vía SintegraWS a partir del CNPJ. Si el CNPJ ya existe para el usuario, se actualizan los campos NFC-e y se devuelve la empresa existente.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken del distribuidor (b2b)
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
cnpj *stringCNPJ de la empresa emisora
cert_file *stringURL HTTPS del certificado digital A1 (.pfx o .p12)
cert_pwd *stringContraseña del certificado
csc_id *stringID del CSC (Código de Seguridad del Contribuyente) en SEFAZ
csc *stringToken CSC (secreto compartido con SEFAZ)
serie_nfceintSerie de la NFC-e
number_nfceintNúmero inicial de NFC-e
telefonestringTeléfono de la empresa

* Campo obligatorio. Los demás datos (nombre, IE, dirección, etc.) se extraen automáticamente vía SintegraWS desde el CNPJ.

Ejemplo de carga útil

        {
          "cnpj": "12345678000199",
          "cert_file": "https://ejemplo.com/cert.pfx",
          "cert_pwd": "senha_certificado",
          "csc_id": "000001",
          "csc": "ABCDEF0123456789",
          "serie_nfce": 1,
          "number_nfce": 1,
          "telefone": "11999999999"
        }

Respuesta

        {
          "success": true,
          "message": "Empresa registrada para NFC-e",
          "data": {
            "company_id": "comp_789012",
            "token": "eyJhbGciOiJIUzI1NiIs..."
          }
        }
POST /api/nfce/company/update
Actualizar datos de la empresa NFC-e

Actualiza la empresa NFC-e identificada por el header token. Todos los campos del body son opcionales — envíe solo los que desee modificar. Al actualizar cep, el sistema resuelve automáticamente stateCode e ibge. Cuando cert_file y cert_pwd vienen juntos, el certificado se valida antes de guardar.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa NFC-e
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body (todos los campos opcionales — envíe ≥ 1)

CampoTipoDescripción
Identificación
namestringRazón social
aliasstringNombre comercial
iestringInscripción Estatal
invoice_typestringRégimen tributario
emailstringCorreo electrónico
telefonestringTeléfono
Dirección
cepstringCódigo postal (actualiza automáticamente stateCode e ibge)
addressstringDirección
house_numberstringNúmero
complementostringComplemento
townstringBarrio
citystringCiudad
statestringUF
NFC-e
csc_idstringID del CSC
cscstringToken CSC
serie_nfceintSerie
number_nfceintPróximo número
cert_filestringURL HTTPS del nuevo certificado A1 (.pfx o .p12)
cert_pwdstringContraseña del certificado

Al menos 1 campo en el body es obligatorio. CNPJ es inmutable.

Ejemplo de carga útil

        {
          "alias": "Tienda Centro - Sucursal 02",
          "telefone": "11988888888",
          "serie_nfce": 2,
          "number_nfce": 1
        }

Respuesta

        {
          "success": true,
          "message": "Empresa NFC-e actualizada con éxito"
        }
POST /api/nfce/company/get
Consultar empresa NFC-e

Devuelve los datos de la empresa NFC-e identificada por el header token. Atención: el método es POST pero no hay campos en el body — la empresa se resuelve solo por el token.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa NFC-e
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

Vacío. Puede enviarse {}.

Respuesta

        {
          "success": true,
          "data": {
            "company_id": "comp_789012",
            "cnpj": "12345678000199",
            "name": "Empresa Exemplo LTDA",
            "alias": "Tienda Centro",
            "ie": "123456789",
            "invoice_type": "simples_nacional",
            "email": "contacto@empresa.com",
            "telefone": "11999999999",
            "cep": "01001000",
            "address": "Calle Ejemplo",
            "house_number": "100",
            "complemento": "Sala 5",
            "town": "Centro",
            "city": "São Paulo",
            "state": "SP",
            "state_code": "SP",
            "cert_file": "https://ejemplo.com/cert.pfx",
            "csc_id": "000001",
            "csc": "ABCDEF0123456789",
            "serie_nfce": 1,
            "number_nfce": 42
          }
        }

Gestión de Categorías Fiscales NFC-e

Las categorías fiscales definen las reglas tributarias aplicadas a los productos al emitir NFC-e. A diferencia de la NFe, la NFC-e solo opera con ventas intraestatales, por lo que la estructura es simplificada: un solo objeto por impuesto, sin necesidad de múltiples escenarios.

Nota: Las categorías NFC-e se almacenan por separado de las categorías NFe. Cada categoría incluye configuraciones de ICMS, PIS, COFINS e IBS/CBS. Todos los endpoints de esta sección requieren los headers token, sign y timestamp.
POST /api/nfce/category/create
Crear categoría fiscal NFC-e

Crea una categoría fiscal NFC-e. Cada categoría tiene un único escenario (salida interna) y usa objetos planos para ICMS, PIS, COFINS e IBS/CBS (sin array, ya que NFC-e no permite múltiples escenarios por categoría). No incluye IPI.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa NFC-e
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body (raíz)

CampoTipoDescripción
descricao *stringDescripción de la categoría
codigo_cfop *stringCódigo CFOP (ej.: 5102, 5405)
icms *objectConfiguración de ICMS (objeto plano)
pis *objectConfiguración de PIS (objeto plano)
cofins *objectConfiguración de COFINS (objeto plano)
ibs_cbsobjectConfiguración de IBS/CBS (Reforma Tributaria, opcional)

icms

CampoTipoDescripción
situacao_tributaria *stringCST/CSOSN (ej.: 102, 500)
aliquota_reducaodecimalPorcentaje de reducción de base
motivo_desoneracaostringCódigo del motivo de exoneración
aliquota_icmsarrayAlícuotas por estado: [{ "estado": "SP", "aliquota": 18.00 }]
aliquota_fcparrayFCP por estado: [{ "estado": "SP", "aliquota": 0.00 }]
beneficio_fiscalarrayBeneficio fiscal por estado: [{ "estado": "SP", "codigo": "SP800001" }]

pis / cofins

CampoTipoDescripción
situacao_tributaria *stringCST PIS/COFINS
aliquota *stringAlícuota porcentual (ej.: "0.00", "1.65", "7.60")

ibs_cbs (opcional)

CampoTipoDescripción
situacao_tributaria *stringCST IBS/CBS
classificacao_tributaria *stringCódigo de clasificación tributaria

* Campo obligatorio.

Ejemplo de payload

        {
          "descricao": "Bebidas não alcoólicas",
          "codigo_cfop": "5102",
          "icms": {
            "situacao_tributaria": "102",
            "aliquota_icms": [
              { "estado": "SP", "aliquota": 18.00 }
            ]
          },
          "pis": {
            "situacao_tributaria": "99",
            "aliquota": "0.00"
          },
          "cofins": {
            "situacao_tributaria": "99",
            "aliquota": "0.00"
          },
          "ibs_cbs": {
            "situacao_tributaria": "000",
            "classificacao_tributaria": "000001"
          }
        }

Respuesta

        {
          "success": true,
          "data": {
            "category_id": "TF00001"
          }
        }
GET /api/nfce/category/get_detail
Obtener detalles de la categoría fiscal NFC-e

Devuelve los datos completos de una categoría fiscal NFC-e (descripción, CFOP, ICMS, PIS, COFINS y IBS/CBS).

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa NFC-e
signstringFirma MD5
timestampstringUnix timestamp en segundos

Query string

CampoTipoDescripción
category_id *stringID de la categoría NFC-e

* Campo obligatorio.

Ejemplo de solicitud

GET /api/nfce/category/get_detail?category_id=TF00001

Respuesta

        {
          "success": true,
          "data": {
            "category_id": "TF00001",
            "descricao": "Bebidas não alcoólicas",
            "codigo_cfop": "5102",
            "icms": {
              "situacao_tributaria": "102",
              "aliquota_icms": [
                { "estado": "SP", "aliquota": 18.00 }
              ],
              "aliquota_fcp": [
                { "estado": "SP", "aliquota": 0.00 }
              ],
              "beneficio_fiscal": [
                { "estado": "SP", "codigo": "SP800001" }
              ]
            },
            "pis": {
              "situacao_tributaria": "99",
              "aliquota": "0.00"
            },
            "cofins": {
              "situacao_tributaria": "99",
              "aliquota": "0.00"
            },
            "ibs_cbs": {
              "situacao_tributaria": "000",
              "classificacao_tributaria": "000001"
            }
          }
        }
GET /api/nfce/category/get_list
Listar categorías fiscales NFC-e

Devuelve una lista paginada de categorías fiscales NFC-e registradas para la empresa autenticada.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa NFC-e
signstringFirma MD5
timestampstringUnix timestamp en segundos

Query string

CampoTipoDescripción
page *intNúmero de página (mínimo 1)
page_size *intÍtems por página (1 a 50)

* Campo obligatorio.

Ejemplo de solicitud

GET /api/nfce/category/get_list?page=1&page_size=20

Respuesta

        {
          "success": true,
          "data": {
            "list": [
              { "category_id": "TF00001", "descricao": "Bebidas não alcoólicas" },
              { "category_id": "TF00002", "descricao": "Alimentos industrializados" }
            ],
            "page": 1,
            "total": 2,
            "total_pages": 1
          }
        }
POST /api/nfce/category/edit
Editar categoría fiscal NFC-e
Nota: Misma estructura que el endpoint /api/nfce/category/create, con el campo adicional obligatorio category_id. Los campos icms, pis, cofins y ibs_cbs se reemplazan íntegramente (no se fusionan).

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa NFC-e
signstringFirma MD5
timestampstringUnix timestamp en segundos

Campo adicional

CampoTipoDescripción
category_id *stringID de la categoría a editar

* Campo obligatorio.

Ejemplo de payload

        {
          "category_id": "TF00001",
          "descricao": "Bebidas não alcoólicas — atualizado",
          "codigo_cfop": "5102",
          "icms": {
            "situacao_tributaria": "102",
            "aliquota_icms": [
              { "estado": "SP", "aliquota": 18.00 }
            ]
          },
          "pis": {
            "situacao_tributaria": "99",
            "aliquota": "0.00"
          },
          "cofins": {
            "situacao_tributaria": "99",
            "aliquota": "0.00"
          },
          "ibs_cbs": {
            "situacao_tributaria": "000",
            "classificacao_tributaria": "000001"
          }
        }

Respuesta

        {
          "success": true,
          "data": {
            "category_id": "TF00001"
          }
        }
POST /api/nfce/category/delete
Eliminar categoría fiscal NFC-e

Elimina una categoría fiscal NFC-e. Operación irreversible. Los productos vinculados a esta categoría seguirán referenciando el category_id eliminado — actualícelos primero.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa NFC-e
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
category_id *stringID de la categoría NFC-e a eliminar

* Campo obligatorio.

Ejemplo de carga útil

        {
          "category_id": "TF123"
        }

Respuesta

        {
          "success": true
        }
POST /api/nfce/create
Emitir NFC-e

Emite una NFC-e (modelo 65, siempre salida interna al estado, sin flete). Diferencias clave respecto al endpoint de NFe: el objeto del consumidor se llama client (no cliente); el número del domicilio es client.number; el consumidor es opcional; no existen impostos.ipi, shipping_address, delivery_address ni transportation. El campo de valor en pag_info se llama amount.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa NFC-e
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Body (raíz)

CampoTipoDescripción
nature_of_operation *stringNaturaleza de la operación (ej.: "Venta de mercadería")
issuance_type *stringTipo de emisión: "1" (normal), "9" (contingencia off-line NFC-e)
ambiente *string"1" producción, "2" homologación
products *arrayLista de productos (ver detalles abajo)
idstringIdentificador externo
ind_presstringPresencia del comprador: "1" presencial (default), "4" entrega a domicilio, "5" presencial fuera del establecimiento, "9" no aplica
ind_intermedstring"0" sin intermediario, "1" marketplace. Obligatorio cuando ind_pres = 2, 3 o 4
total_discount_amountdecimalDescuento total de la factura
trocodecimalValor del vuelto
segurodecimalValor del seguro
outras_despesasdecimalOtros gastos accesorios
informacoes_complementaresstringInformación complementaria al consumidor
informacoes_fiscostringInformación de interés fiscal
clientobjectDatos del consumidor (opcional — ver tabla)
pag_infoarrayPagos (default: dinero al contado — ver tabla)

client (opcional)

Complete solo si el consumidor está identificado. CPF o CNPJ deben enviarse solo con dígitos.

CampoTipoDescripción
cpfstringCPF (define persona física)
cnpjstringCNPJ (persona jurídica)
iestringInscripción estatal
namestringNombre / razón social
enderecostringDirección
numberstringNúmero del domicilio (atención: distinto de la NFe, que usa numero)
complementostringComplemento
bairrostringBarrio
citystringCiudad
ufstringUF (validada por el CEP, si se informa)
cepstringCódigo postal (solo dígitos)
telefonestringTeléfono
emailstringE-mail

products[] (cada ítem)

CampoTipoDescripción
name *stringNombre del producto (caracteres CJK se eliminan)
ncm *stringNCM (8 dígitos)
count *decimalCantidad
unit *stringUnidad comercial (ej.: "UN", "KG")
unit_price *decimalPrecio unitario
total_price *decimalValor total del ítem
origem *intOrigen de la mercadería (0..8)
indicador_total *int1 = compone el total de la factura; 0 = no compone
category_id ⚠stringID de categoría fiscal NFC-e (obligatorio si no envía impostos)
impostos ⚠objectImpuestos manuales (alternativa a category_id; sin IPI)
tax_info ⚠objectAlias de impostos (misma estructura). Solo se usa si impostos está ausente
codigostringCódigo interno del producto
ceststringCEST
gtinstringGTIN/EAN comercial
gtin_tributavelstringGTIN tributable
discount_pricedecimalDescuento del ítem
nItemPedintÍtem del Pedido de Compra (I61). Número secuencial del ítem dentro del pedido referenciado en xPed (viene de id de raíz). Valores válidos: 1–999999. Default: omitido.

pag_info[] (cada ítem)

CampoTipoDescripción
payment_indicator *string"0" contado, "1" a crédito
payment_method *stringForma de pago (01=efectivo, 03=tarjeta crédito, 04=tarjeta débito, 17=PIX, 99=otros, etc.)
amountdecimalMonto pagado en esta forma
card_info.integration_typestring"1" integrado, "2" no integrado (obligatorio para tarjeta 03/04)
card_info.brand_codestringMarca de la tarjeta (obligatorio para tarjeta 03/04)
card_info.acquirer_cnpjstringCNPJ del adquirente
card_info.authorization_codestringCódigo de autorización

* Campo obligatorio. ⚠ category_id, impostos o tax_info, uno de los tres es obligatorio.

Ejemplo simplificado

{
  "nature_of_operation": "Venda de mercadoria",
  "issuance_type": "1",
  "ambiente": "2",
  "ind_pres": "1",
  "client": {
    "cpf": "12345678909",
    "name": "Consumidor Final"
  },
  "products": [
    {
      "name": "Refrigerante 2L",
      "ncm": "22021000",
      "count": 2,
      "unit": "UN",
      "unit_price": 10.50,
      "total_price": 21.00,
      "origem": 0,
      "indicador_total": 1,
      "category_id": "TF00001"
    }
  ],
  "pag_info": [
    {
      "payment_indicator": "0",
      "payment_method": "17",
      "amount": 21.00
    }
  ]
}

Ejemplo completo (todos los campos)

{
  "id": "PEDIDO-2026-0001",
  "nature_of_operation": "Venda de mercadoria",
  "issuance_type": "1",
  "ambiente": "2",
  "ind_pres": "1",
  "ind_intermed": "0",
  "total_discount_amount": 0.00,
  "troco": 0.00,
  "seguro": 0.00,
  "outras_despesas": 0.00,
  "informacoes_complementares": "Pedido entregue na loja",
  "informacoes_fisco": "ICMS recolhido conforme legislação",
  "client": {
    "cpf": "12345678909",
    "cnpj": "",
    "ie": "",
    "name": "Consumidor Final",
    "endereco": "Rua das Flores",
    "number": "100",
    "complemento": "Sala 5",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01001000",
    "telefone": "11999998888",
    "email": "cliente@exemplo.com"
  },
  "products": [
    {
      "codigo": "PROD001",
      "name": "Refrigerante 2L",
      "ncm": "22021000",
      "cest": "0300100",
      "gtin": "7891234567890",
      "gtin_tributavel": "7891234567890",
      "count": 2,
      "unit": "UN",
      "unit_price": 10.50,
      "total_price": 21.00,
      "discount_price": 0.00,
      "origem": 0,
      "indicador_total": 1,
      "category_id": "TF00001",
      "nItemPed": 1
    },
    {
      "codigo": "PROD002",
      "name": "Salgadinho 100g",
      "ncm": "19053100",
      "count": 1,
      "unit": "UN",
      "unit_price": 8.00,
      "total_price": 8.00,
      "origem": 0,
      "indicador_total": 1,
      "impostos": {
        "icms": {
          "codigo_cfop": "5102",
          "situacao_tributaria": "102",
          "industria": "",
          "tipo_pessoa": "juridica"
        },
        "pis": {
          "situacao_tributaria": "99",
          "aliquota": "0.00",
          "tipo_pessoa": "juridica"
        },
        "cofins": {
          "situacao_tributaria": "99",
          "aliquota": "0.00",
          "tipo_pessoa": "juridica"
        },
        "ibs_cbs": {
          "situacao_tributaria": "000",
          "tipo_pessoa": "juridica",
          "classificacao_tributaria": "000001"
        }
      }
    }
  ],
  "pag_info": [
    {
      "payment_indicator": "0",
      "payment_method": "03",
      "amount": 24.00,
      "card_info": {
        "integration_type": "1",
        "brand_code": "01",
        "acquirer_cnpj": "01234567000189",
        "authorization_code": "AUTH123456"
      }
    }
  ]
}

Respuesta

        {
          "success": true,
          "data": {
            "uuid": "abc123...",
            "chave": "35..."
          }
        }
POST /api/nfce/cancel
Cancelar NFC-e

Cancela una NFC-e ya autorizada. A diferencia de la NFe, aquí el motivo de la cancelación lo proporciona el cliente y se envía a SEFAZ. La ventana de cancelación en SEFAZ es corta (normalmente 15-30 minutos tras la autorización).

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
chave *stringClave de 44 dígitos de la NFC-e (atención: aquí es chave, no uuid como en otros endpoints)
motivo *stringJustificación de la cancelación (mínimo 15 caracteres por exigencia SEFAZ)

* Campo obligatorio.

Ejemplo de carga útil

        {
          "chave": "35210112345678901234650010000000051234567890",
          "motivo": "Cancelamento por erro de operacao do caixa"
        }
GET /api/nfce/get_detail
Consultar detalles de la NFC-e

Devuelve los detalles de una NFC-e específica por UUID. Incluye URLs del XML y del DANFE (cupón térmico), además de los datos del cliente cuando se proporcionan.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5 (path incluye la query string)
timestampstringUnix timestamp en segundos

Query string

ParámetroTipoDescripción
uuid *stringUUID de la NFC-e

* Campo obligatorio.

Ejemplo de llamada

GET /api/nfce/get_detail?uuid=65f8b9a1c2d3e4f5a6b7c8d9

Respuesta

        {
          "success": true,
          "data": {
            "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
            "chave": "35210112345678901234650010000000051234567890",
            "serie": 1,
            "number": 5,
            "status": "Authorized",
            "modelo": "nfce",
            "total_price": 145.90,
            "nprot": "135210000123456",
            "motivo": "",
            "xml": "https://oss.example.com/.../chave.xml",
            "danfe": "https://oss.example.com/.../chave_nfce.pdf",
            "client_cpf": "12345678909",
            "client_cnpj": "",
            "client_name": "Cliente",
            "create": "2024-01-10T10:30:00Z",
            "issue_time": "2024-01-10T10:31:00Z"
          }
        }
POST /api/nfce/get_danfe
Generar / obtener DANFE NFC-e (cupón térmico)

Devuelve la URL del DANFE NFC-e (cupón fiscal electrónico) en PDF, con código QR para consulta en SEFAZ. Generación bajo demanda con caché por hash (clave + estado); las llamadas repetidas devuelven la URL existente.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
uuid *stringUUID de la NFC-e (atención: aquí es uuid, a diferencia de cancel que usa chave)

* Campo obligatorio.

Ejemplo de carga útil

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9"
        }

Respuesta

        {
          "success": true,
          "data": {
            "danfe": "https://oss.example.com/.../chave_nfce.pdf"
          }
        }

codeEjemplos Completos NFC-e

Ejemplo 1 — Venta Presencial (sin destinatario)

{
  "nature_of_operation": "Venda de mercadoria", "ambiente": "2", "ind_pres": "1",
  "products": [{ "codigo": "001", "name": "Refrigerante 350ml", "ncm": "22021000", "count": 3,
    "unit": "UN", "unit_price": 5.50, "total_price": 16.50, "category_id": "BEBIDAS",
    "origem": "0", "indicador_total": "1", "cfop": "5102" }],
  "pag_info": [{ "payment_indicator": "0", "payment_method": "17" }]
}

Ejemplo 2 — Entrega a Domicilio (con destinatario)

{
  "nature_of_operation": "Venda de mercadoria", "ambiente": "2", "ind_pres": "4",
  "client": { "cpf": "12345678900", "name": "Maria Silva", "endereco": "Rua das Flores",
    "number": "456", "bairro": "Jardim Primavera", "city": "São Paulo", "uf": "SP", "cep": "04567000" },
  "products": [{ "codigo": "PIZZA01", "name": "Pizza Grande Marguerita", "ncm": "19059090", "count": 1,
    "unit": "UN", "unit_price": 45.90, "total_price": 45.90, "category_id": "ALIMENTOS",
    "origem": "0", "indicador_total": "1", "cfop": "5102" }],
  "pag_info": [{ "payment_indicator": "0", "payment_method": "03" }],
  "frete": 8.00, "informacoes_complementares": "Entrega em até 40 minutos"
}

tune NFe Ajuste / Complementaria

La NFe Complementaria y la NFe de Ajuste son facturas fiscales emitidas para corregir valores fiscales de una factura ya autorizada. A diferencia de la CC-e, que solo corrige datos de registro, estas facturas permiten alterar valores de impuestos, cantidades y precios.

NFe Complementaria (finalidade = 2):
  • Utilizada para agregar valores que fueron informados de menos en la factura original
  • Complemento de precio, cantidad o valor del impuesto
  • Ejemplo: se emitio factura con ICMS del 12% pero lo correcto era 18% — se emite complementaria con la diferencia
NFe de Ajuste (finalidade = 3):
  • Utilizada para ajustes fiscales diversos previstos en la legislacion
  • Ajuste de inventario, transferencia de credito, regularizacion fiscal
  • Ejemplo: ajuste de ICMS por liquidacion, transferencia de credito entre sucursales
Importante:
  • Ambas son facturas fiscales nuevas — generan nueva clave de acceso y nuevo numero
  • Deben referenciar la factura original por el campo ref_nfe_chave (clave de 44 digitos)
  • La factura original necesita estar autorizada
  • Consumen 1 credito cada una (como una emision normal)

Autenticacion

Utiliza el mismo endpoint y autenticacion de la emision de NFe:

HeaderTipoDescripcion
token string Token de la empresa (obtenido en el registro)
sign string Firma MD5: MD5(token + path + body + timestamp)
timestamp string Unix timestamp en segundos (ventana de 5 minutos)

description NFS-e - Factura Electronica de Servicios

La API de NFS-e permite emitir, cancelar y consultar Facturas Electronicas de Servicio. El sistema detecta automaticamente el municipio de la empresa y enruta a la API correcta:

  • Sao Paulo (SP) - Emision via Nota Fiscal Paulistana (SOAP)
  • Otros municipios - Emision via API Nacional (ADN/SEFIN)

El integrador no necesita preocuparse por cual API usar - solo envie los datos y el sistema enruta automaticamente por el codigo IBGE del municipio registrado en la empresa.

EndpointMetodoDescripcion
/api/nfse/createPOSTEmitir NFS-e
/api/nfse/cancelPOSTCancelar NFS-e
/api/nfse/get_danfsePOSTObtener DANFSE (PDF)
/api/nfse/get_xmlPOSTDescargar XML
POST /api/nfs/company/create
Registrar empresa para emisión de NFS-e

Registra (o actualiza) una empresa para emisión de NFS-e. Si el CNPJ ya existe para el usuario, solo los campos NFS-e y el certificado se actualizan; de lo contrario, se crea una nueva empresa y se devuelve un token dedicado. Atención al path: /api/nfs/... (sin la "e"), distinto de los demás endpoints NFS-e.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken B2B del integrador
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
cnpj *stringCNPJ de la empresa (solo dígitos)
name *stringRazón social
cep *stringCódigo postal (solo dígitos)
address *stringDirección
house_number *stringNúmero del domicilio
town *stringBarrio
city *stringCiudad
state *stringUF (2 dígitos, ej.: "SP")
cert_file *stringURL del certificado digital A1 (.pfx)
cert_pwd *stringContraseña del certificado digital
im *stringInscripción Municipal
codigo_municipio_nfse *stringCódigo IBGE del municipio emisor
codigo_servico_nfse *stringCódigo de servicio por defecto (LC 116)
aliasstringNombre comercial
iestringInscripción estatal
invoice_typestringRégimen tributario
unitstringUnidad / sucursal
emailstringE-mail de contacto
telefonestringTeléfono
complementostringComplemento del domicilio
cnae_nfsestringCNAE de la actividad por defecto
serie_nfseintSerie inicial de la NFS-e
number_nfseintNúmero inicial de la NFS-e
regime_especial_tributacaointCódigo del régimen especial de tributación
optante_simples_nacionalboolOptante por Simples Nacional

* Campo obligatorio.

Ejemplo de payload

        {
          "cnpj": "43649380000100",
          "name": "EMPRESA EXEMPLO LTDA",
          "alias": "Ejemplo",
          "ie": "ISENTO",
          "invoice_type": "simples_nacional",
          "email": "contacto@empresa.com",
          "telefone": "11999999999",
          "cep": "03027020",
          "address": "Calle Ejemplo",
          "house_number": "86",
          "complemento": "Piso 2",
          "town": "Centro",
          "city": "São Paulo",
          "state": "SP",
          "cert_file": "https://storage.ejemplo.com/cert.pfx",
          "cert_pwd": "senha-do-certificado",
          "im": "12345678",
          "codigo_municipio_nfse": "3550308",
          "codigo_servico_nfse": "07498",
          "cnae_nfse": "6201501",
          "serie_nfse": 1,
          "number_nfse": 1,
          "regime_especial_tributacao": 0,
          "optante_simples_nacional": true
        }

Respuesta

        {
          "success": true,
          "message": "Empresa cadastrada para NFS-e",
          "data": {
            "company_id": 12345,
            "token": "token-dedicado-da-empresa"
          }
        }

Nota: El token devuelto debe usarse en las demás llamadas NFS-e (/api/nfse/create, /cancel, /get_danfse, /get_xml). Si la empresa ya existe, el mensaje será "Empresa atualizada para NFS-e" y el token devuelto es el existente.

POST /api/nfse/create
Emitir NFS-e

Headers obligatorios

HeaderTipoDescripcion
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "ambiente": "1",
  "id": "REF-001",
  "descricao_servico": "Desenvolvimento de sistemas",
  "valor_servico": 10000.00,
  "aliquota_iss": 2.90,
  "iss_retido": false,
  "codigo_servico": "",
  "cnae": "",
  "valor_deducoes": 0,
  "desconto_incondicionado": 0,
  "desconto_condicionado": 0,
  "valor_iss": 0,
  "valor_pis": 0,
  "valor_cofins": 0,
  "valor_inss": 0,
  "valor_ir": 0,
  "valor_csll": 0,
  "tomador": {
    "cnpj": "43649380000100",
    "cpf": "",
    "name": "EMPRESA TOMADORA LTDA",
    "email": "contato@empresa.com",
    "telefone": "11999999999",
    "inscricao_municipal": "",
    "cep": "03027020",
    "endereco": "Rua Exemplo",
    "numero": "86",
    "complemento": "Andar 2",
    "bairro": "Centro",
    "city": "Sao Paulo",
    "uf": "SP",
    "codigo_municipio": "3550308"
  }
}

Campos Principales

CampoTipoDescripcion
ambientestring"1" = Produccion, "2" = Homologacion
idstringID de referencia externa (opcional)
descricao_servicostringDescripcion del servicio prestado (obligatorio)
valor_servicodecimalValor total del servicio en R$ (obligatorio)
aliquota_issdecimalAlicuota ISS en % (ej: 2.90)
iss_retidobooleanfalse = No retenido, true = Retenido por el tomador
valor_issdecimalOverride del valor del ISS. Si mayor que 0, sustituye el calculo automatico (base_calculo x aliquota_iss div 100). Default: calculado automaticamente
codigo_servicostringCodigo del servicio. Si vacio, usa el predeterminado de la empresa
cnaestringCNAE. Si vacio, usa el predeterminado de la empresa
tomadorobjectDatos del tomador del servicio (obligatorio)

Tomador - Campos

CampoTipoDescripcion
cnpjstringCNPJ del tomador (solo numeros)
cpfstringCPF del tomador (usar cnpj O cpf)
namestringNombre/Razon Social (obligatorio)
emailstringEmail del tomador
telefonestringTelefono
cepstringCodigo postal (obligatorio)
enderecostringDireccion (obligatorio)
numerostringNumero (obligatorio)
complementostringComplemento
bairrostringBarrio (obligatorio)
citystringCiudad
ufstringEstado (2 digitos)
codigo_municipiostringCodigo IBGE del municipio

Respuesta Exitosa

{
  "success": true,
  "data": {
    "_id": "661234abcdef...",
    "uuid": "guid-unico",
    "status": "autorizada",
    "nfse": "48",
    "serie": 1,
    "chave": "Z685RI9C",
    "codigoVerificacao": "Z685RI9C",
    "modelo": "nfse",
    "tipoEmissao": "paulistana",
    "danfse": "https://nfe.prefeitura.sp.gov.br/contribuinte/notaprintpdf.aspx?..."
  }
}
POST /api/nfse/cancel
Cancelar NFS-e

Headers obligatorios

HeaderTipoDescripcion
tokenstringToken de la empresa
signstringFirma MD5
timestampstringUnix timestamp en segundos

Payload

{
  "chave": "Z685RI9C",
  "motivo": "Cancelamento da NFS-e por erro na emissao"
}

Campos

CampoTipoDescripcion
chavestringCodigo de verificacion de la NFS-e (obligatorio)
motivostringMotivo de la cancelación (obligatorio)

Respuesta Exitosa

{
  "success": true,
  "message": "Nota de servico cancelada com sucesso"
}
POST /api/nfse/get_danfse
Obtener DANFSE (PDF)

Headers obligatorios

HeaderTipoDescripcion
tokenstringToken de la empresa
signstringFirma MD5
timestampstringUnix timestamp en segundos

Payload

{
  "chave": "Z685RI9C"
}

Campos

CampoTipoDescripcion
chavestringCodigo de verificacion de la NFS-e (obligatorio)

Respuesta

{
  "success": true,
  "data": {
    "danfse": "https://nfe.prefeitura.sp.gov.br/contribuinte/notaprintpdf.aspx?..."
  }
}

Nota: Para Paulistana (SP), retorna la URL directa del PDF de la prefectura. Para API Nacional, retorna el PDF en base64.

POST /api/nfse/get_xml
Descargar XML de NFS-e

Headers obligatorios

HeaderTipoDescripcion
tokenstringToken de la empresa
signstringFirma MD5
timestampstringUnix timestamp en segundos

Payload

{
  "chave": "Z685RI9C"
}

Campos

CampoTipoDescripcion
chavestringCodigo de verificacion de la NFS-e (obligatorio)

Respuesta

{
  "success": true,
  "data": {
    "dpsXml": "<PedidoEnvioRPS>...</PedidoEnvioRPS>",
    "nfseXml": "<RetornoEnvioRPS>...</RetornoEnvioRPS>"
  }
}

dpsXml: XML enviado a la prefectura/ADN. nfseXml: XML de retorno con el resultado de la emision.

POST /api/invoice/create
Emitir NFe Complementaria (finalidade = 2)

Headers obligatorios

HeaderTipoDescripcion
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "finalidade": "2",
  "ref_nfe_chave": "CHAVE_NFE_AQUI",
  "nature_of_operation": "Complemento de precio",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "1",
  "ind_final": "1",
  "ind_pres": "2",
  "cliente": {
    "cpf": "264.438.800-72",
    "name": "Nome do Destinatário",
    "endereco": "Rua Example",
    "number": "100",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01310100",
    "indIEDest": "9"
  },
  "products": [
    {
      "codigo": "001",
      "name": "Complemento de valor - Produto X",
      "ncm": "82100090",
      "count": 1,
      "unit": "UN",
      "unit_price": 5.00,
      "total_price": 5.00,
      "category_id": "SEU_CATEGORY_ID",
      "origem": "0",
      "indicador_total": "1",
      "cfop": "5102"
    }
  ],
  "pag_info": [
    {
      "payment_method": "90",
      "payment_indicator": "0"
    }
  ]
}

Campos especificos

CampoTipoDescripcion
finalidadestring"2" para Complementaria (obligatorio)
ref_nfe_chavestringClave de acceso de la factura original — 44 digitos (obligatorio)
Nota: Los demas campos siguen el mismo patron del endpoint /api/invoice/create para emision normal. Consulte la documentacion de emision de NFe para detalles de todos los campos.
Pago: En facturas complementarias, el pago generalmente es "90" (Sin Pago) pues se trata solo de complemento de valores fiscales.

Respuesta Exitosa

{
  "success": true,
  "data": {
    "uuid": "a1b2c3d4-e5f6-...",
    "chave": "35260312345678000195550010000004051234567890",
    "status": "Success",
    "motivo": "Autorizado o uso da NF-e",
    "nfe": 405,
    "serie": 1,
    "danfe": "https://storage.../danfe.pdf",
    "xml": "https://storage.../xml.xml"
  }
}
POST /api/invoice/create
Emitir NFe de Ajuste (finalidade = 3)

Headers obligatorios

HeaderTipoDescripcion
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "finalidade": "3",
  "ref_nfe_chave": "CHAVE_NFE_AQUI",
  "nature_of_operation": "Ajuste fiscal",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "1",
  "ind_final": "1",
  "ind_pres": "2",
  "cliente": {
    "cpf": "264.438.800-72",
    "name": "Nome do Destinatário",
    "endereco": "Rua Example",
    "number": "100",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01310100",
    "indIEDest": "9"
  },
  "products": [
    {
      "codigo": "001",
      "name": "Ajuste fiscal - Regularização",
      "ncm": "82100090",
      "count": 1,
      "unit": "UN",
      "unit_price": 0.01,
      "total_price": 0.01,
      "category_id": "SEU_CATEGORY_ID",
      "origem": "0",
      "indicador_total": "1",
      "cfop": "5949"
    }
  ],
  "pag_info": [
    {
      "payment_method": "90",
      "payment_indicator": "0"
    }
  ]
}

Campos especificos

CampoTipoDescripcion
finalidadestring"3" para Ajuste (obligatorio)
ref_nfe_chavestringClave de acceso de la factura original — 44 digitos (obligatorio)
Valores de finalidade disponibles:
ValorDescripcion
1Normal (predeterminado)
2Complementaria
3Ajuste
4Devolucion
Diferencia entre Complementaria y Ajuste:
  • Complementaria (2): Complementa valores de la factura original (precio, impuesto, cantidad informados de menos)
  • Ajuste (3): Ajustes fiscales previstos en la legislacion (regularizacion, transferencia de credito, ajuste de inventario)

edit_note CC-e — Carta de Correccion Electronica

La CC-e (Carta de Correccion Electronica) es un evento vinculado a la NF-e que permite corregir informacion de la factura fiscal ya autorizada, sin alterar valores fiscales. Regulada por el Ajuste SINIEF 01/07.

Que se puede corregir via CC-e:
  • Direccion del destinatario o del emisor
  • Razon social del destinatario (sin alterar CNPJ/CPF)
  • Codigo fiscal de operacion (CFOP), siempre que no cambie la naturaleza de los impuestos
  • Descripcion de la mercancia
  • Datos adicionales e informaciones complementarias
Que NO se puede corregir via CC-e:
  • Valores fiscales (base de calculo, alicuota, valor del impuesto)
  • Cantidad y valor de la mercancia
  • CNPJ/CPF del emisor o destinatario
  • Datos que alteren el calculo de los impuestos
Reglas:
  • Solo facturas con estado autorizada (Success) pueden recibir CC-e
  • El texto de correccion debe tener entre 15 y 1000 caracteres
  • Es posible emitir hasta 20 CC-e para la misma factura fiscal
  • Cada CC-e consume 1 credito

Autenticacion

Todos los endpoints CC-e utilizan la misma autenticacion de la API principal:

HeaderTipoDescripcion
token string Token de la empresa (obtenido en el registro)
sign string Firma MD5: MD5(token + path + body + timestamp)
timestamp string Unix timestamp en segundos (ventana de 5 minutos)
POST /api/invoice/cce/send
Enviar Carta de Corrección (CC-e)

Envía una CC-e (evento 110110) a SEFAZ para corregir datos de una NF-e ya autorizada. La secuencia (nSeqEvento) se calcula automáticamente — no la envíe. Solo se pueden corregir datos no fiscales (no corrige importes, CNPJ, IE, etc.).

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
uuidstringUUID de la NF-e (obligatorio si chave está ausente)
chavestringClave de 44 dígitos de la NF-e (obligatorio si uuid está ausente)
correcao *stringTexto de la corrección (límite SEFAZ: 15–1000 caracteres)

* Campo obligatorio. Al menos uno entre uuid y chave también es obligatorio.

Ejemplo de carga útil

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
          "correcao": "Corrigir nome do destinatario para Empresa XYZ LTDA"
        }

Respuesta

        {
          "success": true,
          "data": {
            "nProt": "135210000123456",
            "nSeqEvento": 1,
            "xml": "https://oss.example.com/.../cce.xml"
          }
        }
POST /api/invoice/cce/get_list
Listar CC-e de una NF-e

Devuelve todas las CC-e (Cartas de Corrección) emitidas para una NF-e específica, ordenadas de la más reciente a la más antigua.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
uuidstringUUID de la NF-e (obligatorio si chave está ausente)
chavestringClave de 44 dígitos de la NF-e (obligatorio si uuid está ausente)

Al menos uno entre uuid y chave es obligatorio.

Ejemplo de carga útil

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9"
        }

Respuesta

        {
          "success": true,
          "data": {
            "items": [
              {
                "id": "65fa1b2c3d4e5f6a7b8c9d0e",
                "detail": "Corregir nombre del destinatario a Empresa XYZ LTDA",
                "nProt": "135210000123456",
                "nSeqEvento": 1,
                "date": "15/01/2024 14:30:00",
                "pdfUrl": "https://oss.example.com/.../cce_seq1.pdf",
                "xmlUrl": "https://oss.example.com/.../cce.xml"
              }
            ],
            "total": 1
          }
        }
POST /api/invoice/cce/download_pdf
Descargar PDF de la CC-e

Devuelve la URL del PDF de la CC-e. El PDF se genera bajo demanda en la primera llamada (renderizado desde el XML de la factura + XML de la CC-e) y se almacena en OSS; las llamadas posteriores devuelven la URL existente.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
cce_id *stringID de la CC-e (ObjectId) devuelto por /api/invoice/cce/get_list en el campo id

* Campo obligatorio.

Ejemplo de carga útil

        {
          "cce_id": "65fa1b2c3d4e5f6a7b8c9d0e"
        }

Respuesta

        {
          "success": true,
          "data": {
            "url": "https://oss.example.com/.../cce_seq1.pdf"
          }
        }
POST /api/invoice/cce/download_xml
Descargar XML de la CC-e

Devuelve la URL del XML firmado de la CC-e (ya almacenado en OSS tras el envío a SEFAZ).

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescripción
cce_id *stringID de la CC-e (ObjectId) devuelto por /api/invoice/cce/get_list en el campo id

* Campo obligatorio.

Ejemplo de carga útil

        {
          "cce_id": "65fa1b2c3d4e5f6a7b8c9d0e"
        }

Respuesta

        {
          "success": true,
          "data": {
            "url": "https://oss.example.com/.../cce.xml"
          }
        }

how_to_reg Manifestación del Destinatario

La Manifestación del Destinatario permite que el destinatario de una NF-e se posicione formalmente sobre una factura emitida contra su CNPJ. Hay 4 tipos de eventos previstos por SEFAZ, cada uno con su propio significado legal.

Tipos de Evento

CódigoNombreSignificadoJustificación
210210 Conocimiento de la Operación El destinatario toma conocimiento de la NF-e, pero aún no la ha confirmado ni rechazado. Generalmente es el primer evento enviado, y es requisito para descargar el XML completo vía DistDFe. No obligatoria
210200 Confirmación de la Operación El destinatario confirma que la operación ocurrió y la mercancía/servicio fue recibido. Evento final, comprueba la recepción. No obligatoria
210220 Desconocimiento de la Operación El destinatario declara que NO reconoce la operación (sospecha de fraude, uso indebido del CNPJ, etc.). Obligatoria (15-255 caracteres)
210240 Operación No Realizada El destinatario reconoce la operación pero declara que NO se concretó (devolución, rechazo de recepción, etc.). Obligatoria (15-255 caracteres)
Regla de secuencia: Tras enviar Conocimiento (210210), se puede enviar Confirmación (210200) O Desconocimiento (210220) U Operación No Realizada (210240). Confirmación/Desconocimiento/No Realizada son estados finales — no pueden sobreescribirse.
Atención: El CNPJ enviado en el campo cnpj debe ser el del destinatario de la NF-e (quien manifiesta) y debe estar registrado en el sistema vinculado al token utilizado. De lo contrario SEFAZ devolverá el rechazo "El autor del evento difiere del destinatario de la NF-e".

Códigos cStat de Retorno

cStatSignificado
135✅ Evento registrado con éxito
573✅ Duplicidad de evento — ya registrado anteriormente (tratado como éxito)
236❌ Clave de acceso inválida
491❌ Manifestación ya registrada — no se puede sobrescribir estado final
596❌ CNPJ del destinatario difiere del informado
656❌ Consumo indebido (rate limit)
POST /api/invoice/manifest
Enviar evento de manifestación del destinatario

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "chave": "35260514200166000187550010000000011000000018",
  "cnpj": "14200166000187",
  "tipo_evento": 210210,
  "justificativa": "Operação reconhecida pelo destinatário"
}

Campos

CampoTipoObligatorioDescripción
chavestringClave de acceso de la NF-e — 44 dígitos
cnpjstringCNPJ del destinatario (quien manifiesta) — 14 dígitos, sin formato. Debe estar registrado en el sistema
tipo_eventointCódigo del evento: 210200, 210210, 210220 o 210240
justificativastringCondicionalObligatoria para 210220 y 210240. Entre 15 y 255 caracteres. Ignorada para 210200 y 210210
Secuencia (nSeqEvento): calculada automáticamente. Para la misma combinación (cnpj + chave + tipo_evento) se incrementa en cada llamada — así los duplicados devuelven cStat: 573 y se graban sin error.

Respuesta de Éxito

{
  "success": true,
  "message": "data",
  "data": {
    "id": "67341a8f5d4e1f2a3b4c5d6e",
    "chave": "35260514200166000187550010000000011000000018",
    "cnpj": "14200166000187",
    "tipo_evento": 210210,
    "desc_evento": "Ciencia da Operacao",
    "nProt": "135260000123456",
    "cStat": 135,
    "xMotivo": "Evento registrado e vinculado a NF-e",
    "nSeqEvento": 1,
    "xml_url": "https://storage.../manifestacao/13-05-2026/352605...210210_1.xml"
  }
}

Campos de la Respuesta

CampoTipoDescripción
idstringObjectId interno del registro de manifestación (usado en /get_xml)
chavestringClave de acceso de la NF-e manifestada
cnpjstringCNPJ del destinatario que manifestó
tipo_eventointCódigo del evento enviado (210200/210210/210220/210240)
desc_eventostringDescripción textual del evento (texto original SEFAZ)
nProtstringNúmero de protocolo SEFAZ — comprobante del evento
cStatintCódigo de estado SEFAZ. 135 = registrado, 573 = duplicidad (también aceptado)
xMotivostringMensaje descriptivo del retorno SEFAZ
nSeqEventointSecuencia del evento asignada automáticamente
xml_urlstringURL pública del XML del procEvento (firmado y protocolizado) almacenado en OSS

Ejemplo — Desconocimiento (210220) con justificación

{
  "chave": "35260514200166000187550010000000011000000018",
  "cnpj": "14200166000187",
  "tipo_evento": 210220,
  "justificativa": "Operação desconhecida pelo destinatário, sem pedido vinculado ao fornecedor informado"
}
POST /api/invoice/manifest/list
Listar manifestaciones enviadas (historial)

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "cnpj": "14200166000187",
  "chave": "",
  "start_create_time": "01/05/2026",
  "end_create_time": "31/05/2026",
  "page": 1,
  "page_size": 20
}

Campos

CampoTipoObligatorioDescripción
cnpjstringNoFiltrar por CNPJ del destinatario. Si se omite, lista de todos los CNPJ del usuario
chavestringNoFiltrar por clave NF-e específica (44 dígitos)
start_create_timestring/longNoFecha inicial. Acepta: "dd/MM/yyyy", "yyyy-MM-dd", "dd/MM/yyyy HH:mm:ss" o Unix timestamp en segundos. Considera 00:00:00 UTC si solo es fecha
end_create_timestring/longNoFecha final. Mismo formato. Si solo es fecha, considera 23:59:59.999 UTC
pageintNoNúmero de página (por defecto 1)
page_sizeintNoItems por página (por defecto 20, máximo 100)

Respuesta de Éxito

{
  "success": true,
  "message": "成功",
  "data": {
    "total": 2,
    "page": 1,
    "page_size": 20,
    "list": [
      {
        "id": "67341a8f5d4e1f2a3b4c5d6e",
        "chave": "35260514200166000187550010000000011000000018",
        "cnpj": "14200166000187",
        "tipo_evento": 210210,
        "desc_evento": "Ciencia da Operacao",
        "justificativa": "Operação reconhecida pelo destinatário",
        "nProt": "135260000123456",
        "nSeqEvento": 1,
        "cStat": 135,
        "xMotivo": "Evento registrado e vinculado a NF-e",
        "xml_url": "https://storage.../...210210_1.xml",
        "create": "2026-05-13 14:25:33"
      }
    ]
  }
}

Campos de la Respuesta

CampoTipoDescripción
totalintTotal de registros que cumplen los filtros (sin importar la paginación)
pageintPágina actual devuelta
page_sizeintTamaño de página devuelto
list[].idstringObjectId interno del registro
list[].chavestringClave de acceso de la NF-e manifestada
list[].cnpjstringCNPJ del destinatario que manifestó
list[].tipo_eventointCódigo del evento (210200/210210/210220/210240)
list[].desc_eventostringDescripción textual del evento
list[].justificativastringJustificación enviada (solo para 210220/210240)
list[].nProtstringProtocolo SEFAZ del evento
list[].nSeqEventointSecuencia del evento
list[].cStatintCódigo de estado SEFAZ
list[].xMotivostringMensaje descriptivo del retorno SEFAZ
list[].xml_urlstringURL pública del XML del procEvento en OSS
list[].createstringFecha/hora UTC del registro (formato yyyy-MM-dd HH:mm:ss)
Orden: los registros se devuelven del más reciente al más antiguo (por create descendente).
POST /api/invoice/manifest/get_xml
Obtener URL del XML de una manifestación específica

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "id": "67341a8f5d4e1f2a3b4c5d6e"
}

Campos

CampoTipoObligatorioDescripción
idstringObjectId de la manifestación — devuelto por /manifest o /manifest/list

Respuesta de Éxito

{
  "success": true,
  "message": "data",
  "data": {
    "id": "67341a8f5d4e1f2a3b4c5d6e",
    "chave": "35260514200166000187550010000000011000000018",
    "tipo_evento": 210210,
    "xml_url": "https://storage.../manifestacao/13-05-2026/352605...210210_1.xml"
  }
}

Errores Comunes

MensajeCausa
id inválidoEl valor no es un ObjectId válido
manifestação não encontradaEl ObjectId existe pero no pertenece al usuario del token, o fue eliminado

cloud_download Captura DistDFe — NFe Recibidas

Permite consultar y descargar NFe y eventos destinados a su CNPJ vía el servicio NFeDistribuicaoDFe de SEFAZ (Ambiente Nacional). La captura es incremental por NSU (Número Sequencial Único) — cada llamada solo descarga lo que aún no se ha capturado.

Tipos de Documento Retornados

doc_typeQué esContenido
resNFe Resumen de NFe Metadatos básicos (clave, valor, emisor, situación). Llega ANTES de enviar Conocimiento — no contiene productos/impuestos
procNFe NFe completa autorizada XML completo de la NF-e (con productos, impuestos, transporte, etc.). Solo viene DESPUÉS de que el destinatario envíe Conocimiento (210210) en la clave
resEvento Resumen de evento Metadatos del evento (clave, tipo, secuencia, motivo)
procEvento Evento completo XML completo del evento (CC-e, cancelación, manifestaciones de otros destinatarios sobre sus notas)
Flujo recomendado:
  1. Llame /received/sync — descarga todos los documentos nuevos
  2. Liste con /received/list filtrando por doc_type: "resNFe" para ver notas sin Conocimiento
  3. Para cada clave de interés, llame /invoice/manifest con tipo_evento: 210210
  4. Llame /received/sync de nuevo — ahora SEFAZ devuelve los procNFe (XML completo) de las claves manifestadas
  5. Use /received/get_xml para obtener la URL del XML y descargar/procesar
Rate limit de SEFAZ: SEFAZ permite como máximo 1 llamada DistDFe por hora por CNPJ. Si se excede, devuelve cStat: 656 (Consumo Indebido). En el entorno de homologación la regla es más permisiva.

Códigos cStat de Retorno de DistDFe

cStatSignificado
137✅ Ningún documento encontrado (fin normal del loop)
138✅ Documentos encontrados — el loop continúa
656❌ Consumo indebido — esperar 1h y reintentar
252❌ Ambiente diferente del informado (producción vs homologación)
280❌ Certificado expirado o inválido
POST /api/invoice/received/sync
Sincronizar — descargar NFe/eventos nuevos de SEFAZ vía DistDFe

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "cnpj": "26638419000167",
  "max_iterations": 50
}

Campos

CampoTipoObligatorioDescripción
cnpjstringCNPJ de la empresa destinataria — 14 dígitos, sin formato. Debe estar registrado en el sistema vinculado al token
max_iterationsintNoNúmero máximo de llamadas SEFAZ por ejecución. Cada llamada descarga hasta 50 documentos. Por defecto 50 (≈2.500 docs), máximo 200
Cómo funciona:
  • Lee el último ultNSU persistido para ese (uid + cnpj)
  • Hace loop llamando a SEFAZ hasta cStat ≠ 138 o alcanzar max_iterations
  • Descomprime los XML (gzip) devueltos
  • Persiste cada documento en w_invoice_received con upload del XML en OSS
  • Actualiza ultNSU y maxNSU en w_invoice_received_sync
  • Deduplica por (uid + cnpj + nsu) — llamadas repetidas no duplican

Respuesta de Éxito

{
  "success": true,
  "message": "data",
  "data": {
    "cnpj": "26638419000167",
    "uf": "SP",
    "initial_nsu": 0,
    "ult_nsu": 2323,
    "max_nsu": 2323,
    "pending": 0,
    "iterations": 8,
    "last_cstat": 137,
    "last_motivo": "Nenhum documento localizado",
    "stats": {
      "resNFe": 3,
      "procNFe": 4,
      "resEvento": 336,
      "procEvento": 5,
      "skipped": 0
    }
  }
}

Campos de la Respuesta

CampoTipoDescripción
cnpjstringCNPJ destinatario consultado
ufstringUF del destinatario usada en la consulta
initial_nsulongNSU de inicio — el último procesado antes de esta ejecución
ult_nsulongNuevo último NSU tras la sincronización
max_nsulongMayor NSU disponible en SEFAZ AN en el momento de la consulta
pendinglongDocumentos aún pendientes (max_nsu - ult_nsu). Si > 0, llame /sync de nuevo para descargar el resto
iterationsintCuántas llamadas SEFAZ se hicieron en esta ejecución
last_cstatintÚltimo cStat devuelto por SEFAZ. 137 es fin normal, 656 es rate limit
last_motivostringMensaje descriptivo del último retorno SEFAZ
stats.resNFeintCantidad de resúmenes de NFe descargados en esta ejecución
stats.procNFeintCantidad de NFe completas descargadas
stats.resEventointCantidad de resúmenes de evento descargados
stats.procEventointCantidad de eventos completos descargados
stats.skippedintDocumentos omitidos (duplicados o error de parseo aislado)
Volumen inicial: empresas que nunca han sincronizado pueden tener cientos o miles de documentos históricos. La primera ejecución puede tardar más e interrumpirse por max_iterations. Verifique pending en la respuesta — si > 0, llame de nuevo (respetando el rate limit).
POST /api/invoice/received/list
Listar documentos capturados (NFe y eventos)

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "cnpj": "26638419000167",
  "doc_type": "resNFe",
  "chave": "",
  "emitente_cnpj": "",
  "start_create_time": "01/05/2026",
  "end_create_time": "31/05/2026",
  "page": 1,
  "page_size": 20
}

Campos

CampoTipoObligatorioDescripción
cnpjstringNoFiltrar por CNPJ destinatario (su CNPJ). Si se omite, lista de todos los del usuario
doc_typestringNoFiltrar por tipo de documento: resNFe, procNFe, resEvento o procEvento
chavestringNoFiltrar por clave de acceso (44 dígitos)
emitente_cnpjstringNoFiltrar por CNPJ del emisor de la NF-e (proveedor)
start_create_timestring/longNoFecha inicial. Acepta "dd/MM/yyyy", ISO o Unix timestamp
end_create_timestring/longNoFecha final. Mismo formato
pageintNoNúmero de página (por defecto 1)
page_sizeintNoItems por página (por defecto 20, máximo 100)

Respuesta de Éxito

{
  "success": true,
  "message": "成功",
  "data": {
    "total": 3,
    "page": 1,
    "page_size": 20,
    "list": [
      {
        "id": "6a04a70d3201b5a62f3ac2f8",
        "nsu": 2318,
        "doc_type": "resNFe",
        "schema": "resNFe_v1.01.xsd",
        "chave": "35260563845920000120550020000085471156822656",
        "cnpj_destinatario": "26638419000167",
        "emitente_cnpj": "63845920000120",
        "emitente_nome": "MEGA ONLINE LTDA",
        "valor": 1.00,
        "dh_emi": "2026-05-13 14:05:35",
        "serie": 0,
        "number": 0,
        "tp_nf": 1,
        "c_sit_nfe": 3,
        "tp_evento": 0,
        "desc_evento": "",
        "n_seq_evento": 0,
        "dh_evento": null,
        "xml_url": "https://storage.../received/13-05-2026/...resNFe_2318.xml",
        "create": "2026-05-13 16:30:05"
      }
    ]
  }
}

Campos de la Respuesta

CampoTipoDescripción
totalintTotal de registros que cumplen los filtros
pageintPágina actual
page_sizeintTamaño de página
list[].idstringObjectId interno (use en /received/get_xml)
list[].nsulongNSU asignado por SEFAZ a este documento
list[].doc_typestringTipo de documento: resNFe, procNFe, resEvento, procEvento
list[].schemastringSchema del documento (ej. resNFe_v1.01.xsd)
list[].chavestringClave de acceso de la NF-e (44 dígitos)
list[].cnpj_destinatariostringCNPJ destinatario (su CNPJ)
list[].emitente_cnpjstringCNPJ del emisor de la NF-e (proveedor)
list[].emitente_nomestringRazón social del emisor
list[].valordecimalValor total de la NF-e (vNF)
list[].dh_emistringFecha/hora de emisión de la NF-e
list[].serieintSerie de la NF-e (solo en procNFe)
list[].numberlongNúmero de la NF-e (solo en procNFe)
list[].tp_nfintTipo de operación: 0=Entrada, 1=Salida (desde la óptica del emisor)
list[].c_sit_nfeintSituación de la NF-e (en resNFe): 1=Autorizada, 2=Denegada, 3=Cancelada
list[].tp_eventointCódigo del evento (en resEvento/procEvento). Ej: 110110=CC-e, 110111=Cancelación, 210210=Conocimiento
list[].desc_eventostringDescripción textual del evento
list[].n_seq_eventointSecuencia del evento
list[].dh_eventostringFecha/hora del evento (solo eventos)
list[].xml_urlstringURL pública del XML del documento en OSS
list[].createstringFecha/hora UTC de la captura
Orden: los registros se devuelven por NSU descendente (más reciente primero).
POST /api/invoice/received/get_xml
Obtener URL del XML de un documento recibido específico

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "id": "6a04a70d3201b5a62f3ac2f8"
}

Campos

CampoTipoObligatorioDescripción
idstringObjectId del documento — devuelto en /received/list

Respuesta de Éxito

{
  "success": true,
  "message": "data",
  "data": {
    "id": "6a04a70d3201b5a62f3ac2f8",
    "nsu": 2318,
    "doc_type": "resNFe",
    "chave": "35260563845920000120550020000085471156822656",
    "xml_url": "https://storage.../received/13-05-2026/...resNFe_2318.xml"
  }
}
Sobre el XML devuelto:
  • resNFe — El XML es solo el resumen, NO contiene productos/impuestos. Úselo para auditoría/triage antes de enviar Conocimiento
  • procNFe — XML completo y firmado, equivalente al generado en la emisión. Listo para importar al ERP del cliente
  • procEvento — XML del evento completo con firma y protocolo

Errores Comunes

MensajeCausa
id inválidoEl valor no es un ObjectId válido
documento recebido não encontradoEl ObjectId existe pero no pertenece al usuario del token
POST /api/invoice/received/get_sync_status
Consultar estado actual de la sincronización DistDFe (sin llamar a SEFAZ)

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "cnpj": "26638419000167"
}

Campos

CampoTipoObligatorioDescripción
cnpjstringCNPJ de la empresa destinataria — 14 dígitos, sin formato

Respuesta — Empresa ya sincronizada

{
  "success": true,
  "message": "成功",
  "data": {
    "cnpj": "26638419000167",
    "uf": "SP",
    "ult_nsu": 2323,
    "max_nsu": 2323,
    "pending": 0,
    "last_sync": "2026-05-13 16:30:05"
  }
}

Respuesta — Empresa nunca sincronizada

{
  "success": true,
  "message": "成功",
  "data": {
    "cnpj": "26638419000167",
    "ult_nsu": 0,
    "max_nsu": 0,
    "pending": 0,
    "last_sync": null
  }
}

Campos de la Respuesta

CampoTipoDescripción
cnpjstringCNPJ consultado
ufstringUF del destinatario usada en la última sincronización (ausente si nunca sincronizó)
ult_nsulongÚltimo NSU procesado. 0 = nunca sincronizó
max_nsulongMayor NSU disponible en SEFAZ en la última sincronización
pendinglongDocumentos pendientes (max_nsu - ult_nsu). Si > 0, hay nuevos documentos en SEFAZ
last_syncstringFecha/hora UTC de la última sincronización exitosa. null si nunca sincronizó
Uso típico: llame a este endpoint antes de /received/sync para decidir si necesita llamar a SEFAZ. Este endpoint no consume el rate limit de SEFAZ — solo lee el estado local de MongoDB.

local_shipping MDF-e — Manifesto Eletrônico de Documentos Fiscais

A API de MDF-e (modelo 58, layout PL-MDFe 3.00) permite emitir, consultar, cancelar e encerrar manifestos de transporte. O MDF-e agrega NF-es e/ou CT-es vinculados a uma operação de transporte, suportando 4 modais: rodoviário, aéreo, aquaviário e ferroviário. Toda informação operacional (condutor, veículo, contratante, CIOT, vale-pedágio, pagamento) vai no corpo do /create — não há eventos de inclusão/alteração após a emissão.

EndpointMétodoDescrição
/api/mdfe/createPOSTEmitir MDF-e
/api/mdfe/consultPOSTConsultar situação do MDF-e
/api/mdfe/cancelPOSTCancelar MDF-e (até 24h após autorização)
/api/mdfe/closePOSTCerrar MDF-e (após finalizar viagem)
POST /api/mdfe/create
Emitir MDF-e

Emite um MDF-e a partir do corpo enviado. Os campos serie, nMDF, cMDF, cDV, cUF, dhEmi, mod, tpEmis, procEmi, verProc são calculados automaticamente pelo servidor. O cliente envia apenas os campos de negócio.

Headers obrigatórios

HeaderTipoDescrição
tokenstringToken de la empresa emisora
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Body — raiz

CampoTipoDescrição
ide *objectIdentificação do MDF-e
emit *objectDatos del emisor
infModal *objectInformações do modal (apenas UM dos quatro: rodo, aereo, aquav, ferrov)
infDoc *objectDocumentos fiscales vinculados
tot *objectTotalizadores de la carga
prodPredobjectProducto predominante de la carga
segarrayInformações de seguro
lacresarrayPrecintos del MDF-e
autXMLarrayCNPJs/CPFs autorizados a acceder al XML
infAdicobjectInformações adicionais (fisco e contribuinte)
infRespTecobjectResponsável técnico (CNPJ, contato, email, etc.)

ide — Identificação

CampoTipoDescrição
tpAmb *intAmbiente: 1=produção, 2=homologação
tpEmit *intTipo do emitente: 1=transportador, 2=carga própria, 3=prestador de serviço de transporte
modal *stringModal: "1"=rodoviário, "2"=aéreo, "3"=aquaviário, "4"=ferroviário
UFIni *stringUF de início da viagem (2 letras)
UFFim *stringUF de fin del viaje
infMunCarrega[] *arrayMunicípios de carregamento: [{ cMunCarrega, xMunCarrega }]
infPercurso[]arrayUFs de la ruta: [{ UFPer }]
tpTranspstringTipo de transportador (rodoviário)
dhIniViagemstringData/hora de início da viagem (ISO 8601)
indCanalVerdestringIndicador de canal verde
indCarregaPosteriorstringIndicador de carga posterior

emit — Emitente

CampoTipoDescrição
CNPJ ⚠stringCNPJ do emitente (14 dígitos)
CPF ⚠stringCPF do emitente (11 dígitos)
IEstringInscrição Estadual
xNome *stringRazão social
xFantstringNombre comercial
enderEmitobjectEndereço: { xLgr, nro, xCpl, xBairro, cMun, xMun, CEP, UF, fone, email }

infModal — Modal Rodoviário (modal="1")

CampoTipoDescrição
rodo.veicTracao *objectVeículo de tração: { placa, tara, RENAVAM, capKG, capM3, tpRod, tpCar, UF, condutor[], prop }
rodo.veicTracao.condutor[] *arrayCondutores: [{ xNome, CPF }] — mínimo 1
rodo.veicReboque[]arrayVeículos de reboque (mesma estrutura de veicTracao sem condutor)
rodo.infANTTobjectInformações da ANTT: { RNTRC, infCIOT[], valePed, infContratante[], infPag[] }
rodo.codAgPortostringCódigo de agendamento no porto
rodo.lacRodo[]arrayPrecintos del modal: [{ nLacre }]

infModal — Modal Aéreo (modal="2")

CampoTipoDescrição
aereo.nac *stringMarca de nacionalidad de la aeronave
aereo.matr *stringMatrícula da aeronave
aereo.nVoo *stringNúmero do voo
aereo.cAerEmb *stringCódigo IATA do aeroporto de embarque
aereo.cAerDes *stringCódigo IATA do aeroporto de destino
aereo.dVoo *stringFecha del vuelo (AAAA-MM-DD)

infModal — Modal Aquaviário (modal="3")

CampoTipoDescrição
aquav.irin *stringIRIN da embarcação
aquav.tpEmb *stringTipo de embarcación (2 dígitos). Use valores ≥ 10 para evitar truncamiento del byte interno de Zeus (ej.: "10", "11")
aquav.cEmbar *stringCódigo da embarcação
aquav.xEmbar *stringNome da embarcação
aquav.nViag *stringNúmero del viaje. No puede empezar con cero (validación del schema) — use "1", "100", etc.
aquav.cPrtEmb *stringCódigo do porto de embarque
aquav.cPrtDest *stringCódigo do porto de destino
aquav.prtTransstringPuerto de transbordo
aquav.tpNavstringTipo de navegação
aquav.infTermCarreg[]arrayTerminales de carga: [{ cTermCarreg, xTermCarreg }]
aquav.infTermDescarreg[]arrayTerminales de descarga
aquav.infEmbComb[]arrayEmbarcações de comboio: [{ cEmbComb, xBalsa }]
aquav.infUnidCargaVazia[]arrayUnidades de carga vacías
aquav.infUnidTranspVazia[]arrayUnidades de transporte vacías

infModal — Modal Ferroviário (modal="4")

CampoTipoDescrição
ferrov.trem *objectDatos del tren: { xPref, dhTrem, xOri, xDest, qVag }
ferrov.vag[] *arrayVagones: [{ pesoBC, pesoR, tpVag, serie, nVag, nSeq, TU }] — mínimo 1. Restricciones de Zeus/SEFAZ: serie debe tener exactamente 3 dígitos (use 100+, ej.: "100"); nVag solo acepta dígitos (long internamente, ej.: "100001"); nSeq opcional 1-3 dígitos.

infDoc — Documentos vinculados

CampoTipoDescrição
infMunDescarga[] *arrayMunicípios de descarga — mínimo 1
infMunDescarga[].cMunDescarga *stringCódigo IBGE do município
infMunDescarga[].xMunDescarga *stringNome do município
infMunDescarga[].infNFe[]arrayNF-es vinculadas: [{ chNFe, SegCodBarras, indReentrega, infUnidTransp[], peri[] }]
infMunDescarga[].infCTe[]arrayCT-es vinculados
infMunDescarga[].infMDFeTransp[]arrayMDF-es de transporte (subcontratação)

prodPred — Produto predominante

CampoTipoDescrição
tpCarga *stringTipo de carga: "01"=granel sólido, "02"=granel líquido, "03"=frigorificada, "04"=conteinerizada, "05"=carga geral, "06"=neogranel, "07"=perigosa, "08"=granel pressurizado
xProd *stringDescrição do produto predominante
cEANstringGTIN/EAN
NCMstringNCM
infLotacaoobjectLotação: { infLocalCarrega{CEP,latitude,longitude}, infLocalDescarrega{...} }

tot — Totalizadores

CampoTipoDescrição
vCarga *decimalValor total de la carga (> 0)
cUnid *stringCódigo da unidade: "01"=KG, "02"=TON
qCarga *decimalCantidad total de la carga (> 0)
qCTeintCantidad de CT-es vinculados
qNFeintCantidad de NF-es vinculadas
qMDFeintCantidad de MDF-es vinculados

* Campo obrigatório. ⚠ Pelo menos um de CNPJ ou CPF é obrigatório.

Exemplo simplificado — Modal Rodoviário

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "modal": "1",
            "UFIni": "SP",
            "UFFim": "ES",
            "infMunCarrega": [
              { "cMunCarrega": "3550308", "xMunCarrega": "SAO PAULO" }
            ],
            "infPercurso": [
              { "UFPer": "MG" }
            ]
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "TRANSPORTADORA EXEMPLO LTDA",
            "enderEmit": {
              "xLgr": "RUA EXEMPLO",
              "nro": "100",
              "xBairro": "CENTRO",
              "cMun": "3550308",
              "xMun": "SAO PAULO",
              "UF": "SP"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "rodo": {
              "veicTracao": {
                "placa": "ABC1D23",
                "tara": 8000,
                "condutor": [
                  { "xNome": "João da Silva", "CPF": "12345678909" }
                ],
                "tpRod": "01",
                "tpCar": "01"
              }
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "3205200",
                "xMunDescarga": "Vila Velha",
                "infNFe": [
                  { "chNFe": "35260512345678000199550010000000011000000018" }
                ]
              }
            ]
          },
          "prodPred": {
            "tpCarga": "05",
            "xProd": "CARGA GERAL"
          },
          "tot": {
            "vCarga": 50000.00,
            "cUnid": "01",
            "qCarga": 1500.00
          }
        }

Exemplo simplificado — Modal Aéreo

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "modal": "2",
            "UFIni": "SP",
            "UFFim": "RJ",
            "infMunCarrega": [
              { "cMunCarrega": "3550308", "xMunCarrega": "SAO PAULO" }
            ]
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "TRANSPORTADORA AEREA EXEMPLO LTDA",
            "enderEmit": {
              "xLgr": "AV AEROPORTO",
              "nro": "5000",
              "xBairro": "CUMBICA",
              "cMun": "3550308",
              "xMun": "SAO PAULO",
              "UF": "SP"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "aereo": {
              "nac": "PT",
              "matr": "ABC1234",
              "nVoo": "AB1234",
              "cAerEmb": "GRU",
              "cAerDes": "GIG",
              "dVoo": "2026-05-21"
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "3304557",
                "xMunDescarga": "Rio de Janeiro",
                "infNFe": [
                  { "chNFe": "35260512345678000199550010000000011000000018" }
                ]
              }
            ]
          },
          "prodPred": {
            "tpCarga": "05",
            "xProd": "CARGA GERAL"
          },
          "tot": {
            "vCarga": 25000.00,
            "cUnid": "01",
            "qCarga": 500.00
          }
        }

Exemplo simplificado — Modal Aquaviário

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "modal": "3",
            "UFIni": "SP",
            "UFFim": "PA",
            "infMunCarrega": [
              { "cMunCarrega": "3548500", "xMunCarrega": "SANTOS" }
            ]
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "NAVEGACAO EXEMPLO LTDA",
            "enderEmit": {
              "xLgr": "AV PORTUARIA",
              "nro": "200",
              "xBairro": "PORTO",
              "cMun": "3548500",
              "xMun": "SANTOS",
              "UF": "SP"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "aquav": {
              "irin": "1234567",
              "tpEmb": "10",
              "cEmbar": "1234",
              "xEmbar": "EMBARCACAO EXEMPLO",
              "nViag": "1",
              "cPrtEmb": "BRSSZ",
              "cPrtDest": "BRBEL"
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "1501402",
                "xMunDescarga": "Belém",
                "infNFe": [
                  { "chNFe": "35260512345678000199550010000000011000000018" }
                ]
              }
            ]
          },
          "prodPred": {
            "tpCarga": "01",
            "xProd": "GRAOS DE SOJA"
          },
          "tot": {
            "vCarga": 500000.00,
            "cUnid": "02",
            "qCarga": 50.00
          }
        }

Exemplo simplificado — Modal Ferroviário

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "modal": "4",
            "UFIni": "MG",
            "UFFim": "SP",
            "infMunCarrega": [
              { "cMunCarrega": "3106200", "xMunCarrega": "BELO HORIZONTE" }
            ]
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "FERROVIA EXEMPLO LTDA",
            "enderEmit": {
              "xLgr": "AV FERROVIARIA",
              "nro": "300",
              "xBairro": "INDUSTRIAL",
              "cMun": "3106200",
              "xMun": "BELO HORIZONTE",
              "UF": "MG"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "ferrov": {
              "trem": {
                "xPref": "F123",
                "dhTrem": "2026-05-21T08:00:00-03:00",
                "xOri": "BELO HORIZONTE",
                "xDest": "SANTOS",
                "qVag": 2
              },
              "vag": [
                {
                  "pesoBC": 30.000,
                  "pesoR": 30.000,
                  "tpVag": "Gôndola",
                  "serie": "100",
                  "nVag": "100001",
                  "nSeq": "1",
                  "TU": 28.000
                },
                {
                  "pesoBC": 30.000,
                  "pesoR": 30.000,
                  "tpVag": "Gôndola",
                  "serie": "101",
                  "nVag": "100002",
                  "nSeq": "2",
                  "TU": 28.000
                }
              ]
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "3548500",
                "xMunDescarga": "Santos",
                "infNFe": [
                  { "chNFe": "35260512345678000199550010000000011000000018" }
                ]
              }
            ]
          },
          "prodPred": {
            "tpCarga": "01",
            "xProd": "MINERIO DE FERRO"
          },
          "tot": {
            "vCarga": 800000.00,
            "cUnid": "02",
            "qCarga": 56.00
          }
        }

Exemplo completo (todos os campos) — Modal Rodoviário

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "tpTransp": "1",
            "modal": "1",
            "UFIni": "SP",
            "UFFim": "ES",
            "infMunCarrega": [
              { "cMunCarrega": "3550308", "xMunCarrega": "SAO PAULO" }
            ],
            "infPercurso": [
              { "UFPer": "MG" }
            ],
            "dhIniViagem": "2026-05-21T08:00:00-03:00",
            "indCanalVerde": "1",
            "indCarregaPosterior": "0"
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "TRANSPORTADORA EXEMPLO LTDA",
            "xFant": "Exemplo Transportes",
            "enderEmit": {
              "xLgr": "RUA EXEMPLO",
              "nro": "100",
              "xCpl": "GALPAO A",
              "xBairro": "CENTRO",
              "cMun": "3550308",
              "xMun": "SAO PAULO",
              "CEP": "01001000",
              "UF": "SP",
              "fone": "1133334444",
              "email": "contato@exemplo.com"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "rodo": {
              "infANTT": {
                "RNTRC": "12345678",
                "infCIOT": [
                  { "CIOT": "1234567890", "CNPJ": "12345678000199" }
                ],
                "valePed": {
                  "categCombVeic": "01",
                  "disp": [
                    {
                      "CNPJForn": "98765432000111",
                      "CNPJPg": "12345678000199",
                      "nCompra": "VP001",
                      "vValePed": 250.00,
                      "tpValePed": "01"
                    }
                  ]
                },
                "infContratante": [
                  {
                    "xNome": "EMPRESA CONTRATANTE LTDA",
                    "CNPJ": "11222333000144"
                  }
                ],
                "infPag": [
                  {
                    "xNome": "João da Silva",
                    "CPF": "12345678909",
                    "Comp": [
                      { "tpComp": "01", "vComp": 5000.00, "xComp": "Frete contratado" }
                    ],
                    "vContrato": 5000.00,
                    "indAltoDesemp": "1",
                    "indPag": "0",
                    "infBanc": {
                      "codBanco": "001",
                      "codAgencia": "1234",
                      "PIX": "12345678909"
                    }
                  }
                ]
              },
              "veicTracao": {
                "cInt": "VT001",
                "placa": "ABC1D23",
                "RENAVAM": "12345678901",
                "tara": 8000,
                "capKG": 25000,
                "capM3": 80,
                "prop": {
                  "CNPJ": "12345678000199",
                  "RNTRC": "12345678",
                  "xNome": "TRANSPORTADORA EXEMPLO LTDA",
                  "IE": "123456789012",
                  "UF": "SP",
                  "tpProp": "0"
                },
                "condutor": [
                  { "xNome": "João da Silva", "CPF": "12345678909" },
                  { "xNome": "Maria Souza", "CPF": "98765432100" }
                ],
                "tpRod": "01",
                "tpCar": "01",
                "UF": "SP"
              },
              "veicReboque": [
                {
                  "cInt": "VR001",
                  "placa": "DEF4G56",
                  "RENAVAM": "98765432109",
                  "tara": 3500,
                  "capKG": 30000,
                  "capM3": 90,
                  "tpCar": "02",
                  "UF": "SP"
                }
              ],
              "lacRodo": [
                { "nLacre": "LACRE001" },
                { "nLacre": "LACRE002" }
              ]
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "3205200",
                "xMunDescarga": "Vila Velha",
                "infNFe": [
                  {
                    "chNFe": "35260512345678000199550010000000011000000018",
                    "SegCodBarras": "",
                    "indReentrega": "0",
                    "infUnidTransp": [
                      {
                        "tpUnidTransp": "1",
                        "idUnidTransp": "UT001",
                        "qtdRat": 100.000,
                        "lacUnidTransp": [{ "nLacre": "LACRE-UT-001" }],
                        "infUnidCarga": [
                          {
                            "tpUnidCarga": "1",
                            "idUnidCarga": "UC001",
                            "qtdRat": 100.000,
                            "lacUnidCarga": [{ "nLacre": "LACRE-UC-001" }]
                          }
                        ]
                      }
                    ],
                    "peri": []
                  }
                ]
              }
            ]
          },
          "seg": [
            {
              "infResp": {
                "respSeg": "1",
                "CNPJ": "12345678000199"
              },
              "infSeg": {
                "xSeg": "SEGURADORA EXEMPLO SA",
                "CNPJ": "55666777000188"
              },
              "nApol": "APOL-2026-001",
              "nAver": ["AV001", "AV002"]
            }
          ],
          "prodPred": {
            "tpCarga": "05",
            "xProd": "CARGA GERAL",
            "cEAN": "7891234567890",
            "NCM": "84713012",
            "infLotacao": {
              "infLocalCarrega": {
                "CEP": "01001000",
                "latitude": "-23.5505",
                "longitude": "-46.6333"
              },
              "infLocalDescarrega": {
                "CEP": "29100000",
                "latitude": "-20.3297",
                "longitude": "-40.2925"
              }
            }
          },
          "tot": {
            "qCTe": 0,
            "qNFe": 1,
            "qMDFe": 0,
            "vCarga": 50000.00,
            "cUnid": "01",
            "qCarga": 1500.00
          },
          "lacres": [
            { "nLacre": "LACRE-GERAL-001" }
          ],
          "autXML": [
            { "CNPJ": "11222333000144" }
          ],
          "infAdic": {
            "infAdFisco": "Documento emitido em conformidade com a legislação vigente",
            "infCpl": "Transporte com escolta armada"
          },
          "infRespTec": {
            "CNPJ": "12345678000199",
            "xContato": "Suporte Técnico",
            "email": "suporte@exemplo.com",
            "fone": "1133334444"
          }
        }

Respuesta de éxito

        {
          "success": true,
          "data": {
            "chMDFe": "35260512345678000199580010000000011000000018",
            "nMDF": 1,
            "serie": 1,
            "protocolo": "135260000123456",
            "xml": "https://storage.../mdfe/2026-05-21/35260512345678000199580010000000011000000018.xml"
          }
        }
POST /api/mdfe/consult
Consultar situação do MDF-e

Consulta a situação do MDF-e diretamente na SEFAZ a partir da chave de acesso.

Headers obrigatórios

HeaderTipoDescrição
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescrição
chMDFe *stringChave de acesso do MDF-e (44 dígitos)

* Campo obrigatório.

Ejemplo de carga útil

        {
          "chMDFe": "35260512345678000199580010000000011000000018"
        }

Respuesta

        {
          "success": true,
          "data": {
            "chMDFe": "35260512345678000199580010000000011000000018",
            "cStat": 100,
            "xMotivo": "Autorizado o uso do MDF-e",
            "protocolo": "135260000123456",
            "dhRecbto": "2026-05-21T10:30:00-03:00",
            "encerrado": false,
            "cancelado": false
          }
        }
POST /api/mdfe/cancel
Cancelar MDF-e

Cancela um MDF-e autorizado. Janela: até 24 horas após a autorização. Não permitido se o MDF-e já tiver sido encerrado.

Headers obrigatórios

HeaderTipoDescrição
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescrição
chMDFe *stringChave de acesso do MDF-e (44 dígitos)
xJust *stringJustificativa do cancelamento (mínimo 15 caracteres por exigência SEFAZ)

* Campo obrigatório.

Ejemplo de carga útil

        {
          "chMDFe": "35260512345678000199580010000000011000000018",
          "xJust": "Cancelamento por erro no preenchimento dos dados do veiculo"
        }

Respuesta

        {
          "success": true,
          "data": {
            "chMDFe": "35260512345678000199580010000000011000000018",
            "cStat": 135,
            "xMotivo": "Evento registrado e vinculado a MDF-e",
            "nProt": "135260000123457",
            "dhRegEvento": "2026-05-21T11:00:00-03:00"
          }
        }
POST /api/mdfe/close
Cerrar MDF-e

Encerra um MDF-e ao final da viagem. Após o encerramento, não é mais possível cancelar. Os campos dtEnc, cUF e cMun são opcionais — quando omitidos, o sistema infere a partir do MDF-e original (data atual, UF e município do emitente).

Headers obrigatórios

HeaderTipoDescrição
tokenstringToken de la empresa emisora
signstringFirma MD5
timestampstringUnix timestamp en segundos

Body

CampoTipoDescrição
chMDFe *stringChave de acesso do MDF-e (44 dígitos)
dtEncstringFecha del cierre (AAAA-MM-DD). Default: fecha actual
cUFintCódigo IBGE da UF onde ocorreu o encerramento. Default: UF do emitente
cMunstringCódigo IBGE do município onde ocorreu o encerramento. Default: município do emitente

* Campo obrigatório.

Ejemplo de carga útil

        {
          "chMDFe": "35260512345678000199580010000000011000000018",
          "dtEnc": "2026-05-22",
          "cUF": 32,
          "cMun": "3205200"
        }

Respuesta

        {
          "success": true,
          "data": {
            "chMDFe": "35260512345678000199580010000000011000000018",
            "cStat": 135,
            "xMotivo": "Evento registrado e vinculado a MDF-e",
            "nProt": "135260000123458",
            "dhRegEvento": "2026-05-22T18:00:00-03:00"
          }
        }

vpn_key SSO — Inicio Automático vía Token

Base URL (Producción)
https://api.tffiscal.com
Autenticación
Headers: sign, timestamp, token
Validez del Ticket
60 segundos — uso único

SSO (Single Sign-On) permite que su ERP genere un enlace de acceso directo a TFiscal para el usuario, ya autenticado en la empresa correspondiente y en el idioma deseado, sin que tenga que ingresar credenciales.

Cómo funciona:
  • El ERP llama a POST /api/sso/create_ticket enviando el token de la empresa.
  • TFiscal devuelve un redirectUrl con un ticket opaco de uso único.
  • El ERP redirige el navegador del usuario a esa URL.
  • La página consume el ticket y el usuario entra al panel de la empresa.
⚠️ Seguridad: el token real de la empresa nunca aparece en la URL. Sólo el ticket efímero (válido por 60 segundos y de uso único) se expone al navegador.
POST /api/sso/create_ticket
Generar enlace de inicio automático

Genera un ticket de uso único válido por 60 segundos para iniciar sesión automáticamente al usuario en el panel de la empresa correspondiente al token.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa (el mismo usado para emitir NF-e)
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Payload

{
  "token": "TOKEN_DA_EMPRESA",
  "language": "br",
  "page": "emitir_nfe"
}

Campos

CampoObligatorioTipoDescripción
tokenstringToken de la empresa (w_company.token) — el mismo usado en /api/invoice/create
languageNostringIdioma de la interfaz: br, en, zh, es, ja, ko. Default: br
pageNostringPágina de destino después del login. Valores aceptados: emitir_nfe. Vacío o ausente abre el panel por defecto (/company/kanban).

Respuesta de éxito

{
  "success": true,
  "message": "ticket",
  "ticket": "nXk9sz6I6KHOt_OM72ZmfyU5p1eOet5k5Bd3AFZtspg",
  "redirectUrl": "https://www.tffiscal.com/sso#ticket=nXk9sz6I6KHOt_OM72ZmfyU5p1eOet5k5Bd3AFZtspg",
  "expiresInSeconds": 60,
  "expiresAt": "2026-04-24T18:34:56.0000000Z"
}

Campos de la respuesta

CampoTipoDescripción
successbooleantrue cuando el ticket se generó con éxito
ticketstringTicket opaco (aleatorio, 32 bytes base64url)
redirectUrlstringURL completa a la que el ERP debe redirigir el navegador
expiresInSecondsnumberValidez en segundos (siempre 60)
expiresAtstringFecha/hora UTC de expiración (ISO 8601)

Respuestas de error

MensajeCausa
Token es obligatorioEl campo token no fue enviado en el body
Token inválidoEl token no corresponde a ninguna empresa registrada
Este token está vinculado a múltiples empresas. Envíe el token de la empresa a la que desea acceder.Token de integrador con más de una empresa — envíe el token específico de la empresa
Rate limit exceededMás de 30 llamadas por minuto para el mismo token
POST /api/sso/consume_ticket
Consumir ticket y recibir el JWT de sesión

Intercambia el ticket generado por /api/sso/create_ticket por el JWT de sesión de TFiscal. Este endpoint es llamado por el frontend (ruta /sso) y no requiere headers sign/timestamp — el propio ticket opaco es la credencial. Cada ticket puede consumirse solo una vez y expira en 60 segundos.

Body

CampoTipoDescripción
ticket *stringTicket devuelto por create_ticket

* Campo obligatorio.

Ejemplo de payload

        {
          "ticket": "nXk9sz6I6KHOt_OM72ZmfyU5p1eOet5k5Bd3AFZtspg"
        }

Respuesta de éxito

        {
          "success": true,
          "message": "Login succeeded",
          "access_token": "eyJhbGciOi...",
          "type": "user",
          "uid": 1234,
          "company_id": 5678,
          "language": "br",
          "page": "emitir_nfe"
        }

Campos de la respuesta

CampoTipoDescripción
access_tokenstringJWT de sesión (validez de 365 días). Úselo en el header Authorization de las llamadas TFiscal
typestringTipo de usuario (user, admin, etc.)
uidintID interno del usuario
company_idintID de la empresa seleccionada en create_ticket
languagestringIdioma elegido en create_ticket (siempre normalizado)
pagestringPágina de destino (o string vacío si no se define)

Respuestas de error

MensajeCausa
Ticket inválidoBody sin campo ticket
Ticket inválido ou expiradoEl ticket no existe, ya fue consumido o pasó los 60 segundos
Rate limit exceededMás de 60 consumos por minuto desde la misma IP
Sessão inválidaEl usuario vinculado al ticket ya no existe

lock Restricciones y Seguridad

Características del ticket

CaracterísticaValor
Validez60 segundos después de generado
UsoÚnico — una vez consumido no se puede reutilizar
Rate limit30 tickets/minuto por token · 60 consumos/minuto por IP
AlmacenamientoMongoDB con TTL automático — tickets expirados se eliminan

Restricciones de navegación

Los usuarios autenticados vía SSO tienen acceso solamente a las pantallas de la empresa correspondiente (/invoice/company/*). Los intentos de acceder a otras áreas (paneles de distribuidor, reportes generales, administración) son redirigidos automáticamente al panel de la empresa.

Sesión después del login

Después de intercambiar el ticket por un JWT, el usuario tiene una sesión normal en TFiscal (JWT válido por 365 días, igual que el login tradicional). Los 60 segundos son sólo la ventana entre generar el ticket y abrir el enlace — después el usuario permanece conectado normalmente hasta cerrar sesión.

⚠️ Importante: el create_ticket debe ser llamado exclusivamente server-side por el ERP. Nunca llame a este endpoint directamente desde el navegador — expondría el token de la empresa en el front-end.

badge Contador (Accountant)

API para consulta de los datos de registro de contadores vinculados a una empresa. Útil para sistemas contables externos que necesitan obtener los datos completos del contador responsable de una empresa determinada.

POST /api/accountant/get_info
Obtener información del contador vinculado a la empresa

Devuelve los datos completos de registro del contador vinculado a la empresa informada. El contador debe estar previamente vinculado a la empresa (mismo CNPJ) y el correo informado debe coincidir con el registro.

Headers obligatorios

HeaderTipoDescripción
tokenstringToken de la empresa o token B2B del integrador
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Body

CampoTipoDescripción
companyId *intID de la empresa vinculada al token
accountantId *stringObjectId del contador (24 hex)
email *stringCorreo del contador (debe coincidir con el registro)

* Campo obligatorio.

Ejemplo de payload

      {
        "companyId": 12345,
        "accountantId": "5f3a8b9c1d2e4f5a6b7c8d9e",
        "email": "contador@oficina.com"
      }

Respuesta de éxito

      {
        "success": true,
        "data": {
          "email": "contador@oficina.com",
          "officeDocumentType": "CNPJ",
          "officeDocument": "12345678000199",
          "officeName": "Oficina Contable LTDA",
          "responsibleName": "Juan Silva",
          "crc": "SP123456/O-7",
          "accountantCpf": "12345678909",
          "workAddress": "Calle Ejemplo, 100 - Centro - São Paulo/SP",
          "site": "https://oficina.com",
          "landline": "1133334444",
          "mobile": "11999998888",
          "assistantName": "María Souza",
          "assistantEmail": "maria@oficina.com",
          "assistantPhone": "11988887777",
          "observations": "Atención de lunes a viernes, 9h a 18h"
        }
      }

Campos de la respuesta

CampoTipoDescripción
emailstringCorreo principal del contador
officeDocumentTypestringTipo de documento de la oficina: "CNPJ" o "CPF"
officeDocumentstringDocumento de la oficina (solo dígitos)
officeNamestringRazón social / nombre de la oficina
responsibleNamestringNombre del contador responsable
crcstringNúmero del CRC (Consejo Regional de Contabilidad)
accountantCpfstringCPF del contador (solo dígitos)
workAddressstringDirección comercial
sitestringSitio web de la oficina
landlinestringTeléfono fijo
mobilestringMóvil
assistantNamestringNombre del asistente
assistantEmailstringCorreo del asistente
assistantPhonestringTeléfono del asistente
observationsstringObservaciones libres del registro

Respuestas de error

MensajeCausa
会计师ID参数异常或不存在accountantId ausente o no es un ObjectId válido
该会计师邮箱异常或不存在email inválido o no registrado
发票账号{companyId}异常或不存在companyId no pertenece al usuario del token
该会计师未绑定该发票账号El contador no está vinculado a la empresa informada