TF Fiscal

APIs principales

NF-e

18 endpoints

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
price_includes_ipibooleanSi los precios unitarios ya incluyen IPI. Con true el IPI se calcula por dentro y el total coincide con el precio cotizado; por defecto false. Puede sobrescribirse por producto
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 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
price_includes_ipibooleanSobrescribe price_includes_ipi para este producto; omítalo para seguir la configuración de la factura
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)
impostosobjectConfiguración de tributos en línea (alternativa a category_id). Vea la estructura abajo. El nombre anterior tax_info sigue siendo aceptado.
disable_difalbooleanDesactiva el cálculo de DIFAL para este ítem
desconta_icms_pis_cofinsbooleanDescuenta el ICMS antes de calcular PIS/COFINS — tributa (importe − ICMS), estándar actual en Brasil; por defecto false (sin descuento, impuesto mayor)
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

CampoTipoDescripción
industriastringIndustria/alícuota base (alias: aliquota)
icms
icms.codigo_cfopstringCFOP
icms.situacao_tributariastringCST/CSOSN del ICMS
icms.tipo_pessoastringTipo de persona (PF/PJ)
icms.codigo_beneficio_fiscalstringcBenef (código de beneficio fiscal)
icms.aliquotastringAlícuota del ICMS propio en % (CST 00, 10, 20, 51, 70, 90). Si está vacío, el sistema la deriva por la tabla interestatal/interna
icms.aliquota_reducaostringPorcentaje de reducción de la base del ICMS propio (CST 20, 51, 70, 90)
icms.aliquota_ststringAlícuota del ICMS-ST del estado de destino en % (CST 10, 30, 70, 90)
icms.aliquota_reducao_ststringPorcentaje de reducción de la base del ICMS-ST (CST 10, 30, 70, 90)
icms.aliquota_mvastringMVA/IVA-ST en % (CST 10, 30, 70, 90)
icms.aliquota_fcpstringAlícuota del FCP propio en % — emite pFCP/vFCP en el grupo ICMS (CST 00, 10, 20, 51, 70, 90)
icms.aliquota_fcp_ststringAlícuota del FCP-ST en % (CST 10, 30, 70, 90)
icms.aliquota_fcp_uf_deststringAlícuota del FCP del estado de destino (pFCPUFDest). Si se omite, usa aliquota_fcp
icms.aliquota_uf_deststringAlícuota de ICMS del estado de destino. Normalmente no hace falta — la plataforma mantiene las alícuotas estándar por estado. Indíquela solo si el producto tiene alícuota diferenciada en el destino (bebidas, tabaco, energía). Es la del destino, no la del remitente
icms.difal_desconta_icms_interbooleanResta de la base del DIFAL el ICMS interestatal ya pagado — el "com exclusão" de la normativa estatal. Vea "Interestatal: cómo indicar la base del DIFAL" en esta página
icms.difal_base_por_dentrobooleanAmplía la base del DIFAL porque el impuesto va incluido en el precio — la "base dupla" de la normativa estatal. Vea "Interestatal: cómo indicar la base del DIFAL" en esta página
icms.v_bc_uf_deststringSi ya calculó la base del DIFAL, indique el importe (R$) aquí. Las dos opciones anteriores dejan de aplicarse
icms.aliquota_creditostringAlícuota de crédito del Simples Nacional en % (CSOSN 101, 201, 900)
icms.aliquota_diferimentostringPorcentaje de diferimiento del ICMS (CST 51)
icms.motivo_desoneracaostringCódigo del motivo de exoneración del ICMS (CST 20, 40, 41, 50, 90)
icms.ad_rem_icmsstringICMS monofásico — alícuota ad rem en R$/unidad (CST 02, 15, 53)
icms.ad_rem_icms_retstringICMS monofásico — ad rem retenido en R$/unidad (CST 15, 61)
icms.p_dif_monostringICMS monofásico — porcentaje de diferimiento (CST 53)
icms.q_bc_monostringICMS monofásico — cantidad tributada (litros/kg). Vacío usa la cantidad del ítem (CST 02, 15, 53)
icms.valor_desoneracaostringValor del ICMS exonerado en BRL — emite vICMSDeson (CST 40, 41, 50, 90)
icms.v_bc_st_retstringBase de cálculo del ICMS-ST retenido en la operación anterior (informado, no calculado — CST 60, CSOSN 500)
icms.p_ststringAlícuota soportada por el consumidor final en % (informado, no calculado — CST 60, CSOSN 500)
icms.v_icms_st_retstringValor del ICMS-ST retenido en la operación anterior (informado, no calculado — CST 60, CSOSN 500)
icms.v_icms_substitutostringValor del ICMS propio del sustituto (informado, no calculado — CST 60, CSOSN 500)
icms.v_bc_fcp_st_retstringBase de cálculo del FCP retenido por ST (informado, no calculado — CST 60, CSOSN 500)
icms.p_fcp_st_retstringAlícuota del FCP retenido por ST en % (informado, no calculado — CST 60, CSOSN 500)
icms.v_fcp_st_retstringValor del FCP retenido por ST (informado, no calculado — CST 60, CSOSN 500)
ipi
ipi.codigo_enquadramentostringCódigo de encuadre legal del IPI
ipi.situacao_tributariastringCST IPI
ipi.aliquotastringAlícuota IPI
ipi.valor_unidadestringIPI por cantidad — valor en R$/unidad. Solo se usa cuando no hay alícuota porcentual; si hay aliquota, el porcentaje prevalece (CST 00, 50, 49, 99)
ipi.tipo_pessoastringTipo de persona
pis
pis.situacao_tributariastringCST PIS
pis.aliquotastringAlícuota PIS
pis.valor_unidadestringPIS por cantidad — valor en R$/unidad. vPIS = cantidad × valor (CST 03 y demás formas por cantidad)
pis.tipo_pessoastringTipo de persona
cofins
cofins.situacao_tributariastringCST COFINS
cofins.aliquotastringAlícuota COFINS
cofins.valor_unidadestringCOFINS por cantidad — valor en R$/unidad. vCOFINS = cantidad × valor (CST 03 y demás formas por cantidad)
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
ibs_cbs.p_ibs_ufstringAlícuota del IBS estatal en % (opcional; vacío usa el valor por defecto de transición, 0,10 en 2026). Acepta punto o coma
ibs_cbs.p_ibs_munstringAlícuota del IBS municipal en % (opcional; por defecto 0 en 2026)
ibs_cbs.p_cbsstringAlícuota de la CBS en % (opcional; por defecto 0,90 en 2026)
ibs_cbs.p_red_aliqstringPorcentaje de reducción de alícuota (CST 011, 200, 515)
ibs_cbs.p_difstringPorcentaje de diferimiento (CST 510, 515)
ibs_cbs.p_red_bcstringPorcentaje de reducción de la base de cálculo (CST 222)
ibs_cbs.proporcaostringProporción de la operación en % (CST 221)
ibs_cbs.aliquota_cbs_monostringCBS monofásica — alícuota en % sobre la base; prevalece sobre valor_unidade_cbs (CST 620)
ibs_cbs.aliquota_ibs_monostringIBS monofásico — alícuota en % sobre la base; prevalece sobre valor_unidade_ibs (CST 620)
ibs_cbs.valor_unidade_cbsstringCBS monofásica — ad rem en R$/unidad; solo se usa cuando no hay alícuota porcentual (CST 620)
ibs_cbs.valor_unidade_ibsstringIBS monofásico — ad rem en R$/unidad; solo se usa cuando no hay alícuota porcentual (CST 620)
ibs_cbs.valor_deducao_legalstringValor de la deducción legal de la base en R$ (CST 830)
difal
difal.disable_difalbooleanDesactiva DIFAL para el ítem (alternativa al disable_difal en el producto)

Interestatal: cómo indicar la base del DIFAL

Esta sección aplica solo a ventas interestatales a persona física (no contribuyente). No aplica a operaciones internas ni B2B.

Paso 1 — consulte el estado del destinatario

Estado del destinatarioEnviar además de aliquota, aliquota_fcp
PE, RJnada más
SEsolo difal_base_por_dentro: true
los otros 24 estados
AC AL AM AP BA CE DF ES GO MA MG MS MT PA PB PI PR RN RO RR RS SC SP TO
difal_desconta_icms_inter: true
difal_base_por_dentro: true

Atención: el método de la base del DIFAL determina directamente el impuesto a pagar; una elección incorrecta genera pago insuficiente (con riesgo de liquidación y recargos) o excesivo. La tabla anterior refleja la práctica predominante por estado y es solo de referencia — la normativa estatal cambia y ciertos productos pueden seguir reglas diferenciadas. Confirme el método aplicable al estado de destino con su contador o asesor fiscal antes de pasar a producción. En caso de duda, no envíe difal_desconta_icms_inter ni difal_base_por_dentro: la base será el importe de la factura, el tratamiento más conservador.

Paso 2 — ejemplos de solicitud por escenario

Venta a RJ — difal_desconta_icms_inter y difal_base_por_dentro no son necesarios (FECP 2%)

{
  "icms": { "codigo_cfop": "6102", "situacao_tributaria": "00",
            "aliquota": "4", "aliquota_fcp": "2" }
}

Venta a AL — difal_desconta_icms_inter y difal_base_por_dentro ambos true (FECP 1%)

{
  "icms": { "codigo_cfop": "6102", "situacao_tributaria": "00",
            "aliquota": "4", "aliquota_fcp": "1",
            "difal_desconta_icms_inter": true,
            "difal_base_por_dentro": true }
}

Si su sistema ya calcula la base del DIFAL, indique v_bc_uf_dest; difal_desconta_icms_inter y difal_base_por_dentro dejan de aplicarse

{
  "icms": { "aliquota": "4", "aliquota_fcp": "1", "v_bc_uf_dest": "122.29" }
}

Qué produce cada opción

Cómo enviarBase del DIFALDIFAL a pagar
sin difal_desconta_icms_inter ni difal_base_por_dentro100,0016,50
ambos en true122,2921,07
v_bc_uf_dest=150150,0026,75

Factura de 100,00, ICMS interestatal de 4,00, alícuota de destino 20,5%, FECP 1%.

Por qué difieren los estados (contexto, puede omitirse)

El ICMS es un impuesto incluido en el precio. Algunos estados exigen que el propio DIFAL se reconstituya en la base (base dupla), deduciendo antes el ICMS interestatal ya pagado (com exclusão); otros usan directamente el importe de la operación (base única). difal_desconta_icms_inter y difal_base_por_dentro corresponden a esos dos pasos. La alícuota de destino la mantiene la plataforma.

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.

Campos de la respuesta (data)

CampoTipoDescripción
uuidstringIdentificador interno de la NF-e. Úselo en las consultas siguientes (/api/invoice/get_detail, /refresh, /cancel)
statusstringSituación: "Success" (autorizada), "Failed" (rechazada/fallo), "Processing" (en procesamiento), "Canceled" (cancelada)
motivostringMensaje oficial de la autoridad fiscal según el cStat (formato bilingüe PT / 中文)
nfeintNúmero de la NF-e emitida
serieintSerie de la NF-e
chavestringClave de acceso de 44 dígitos (vacía cuando la nota no fue autorizada)
modelostringModelo del documento: "nfe"
epecbooleanEmisión en contingencia EPEC
xmlstringURL del XML autorizado. El DANFE (PDF) y demás formatos se obtienen en /api/invoice/get_detail

Respuesta — rechazo / error

Cuando la autoridad fiscal rechaza la nota, success es false y data.motivo indica el motivo; la chave vuelve vacía. Los errores de validación de campos (antes de llegar a la autoridad fiscal) devuelven success: false con el mensaje en message, sin el objeto data.
        {
          "success": false,
          "data": {
            "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
            "status": "Failed",
            "motivo": "Rejeição 226: Código da UF do Emitente diverge da UF autorizadora / 拒绝 226: 发件人所在州代码与授权州不一致",
            "nfe": 100,
            "serie": 1,
            "chave": "",
            "modelo": "nfe",
            "epec": false,
            "xml": ""
          }
        }
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: "Success" (autorizada), "Canceled" (cancelada), "Voided" (inutilizada), "Processing" (en proceso), "InvoicingFailed" (fallo en la emisión), "Failed" (falló), "Contingencia" (contingencia offline), "Unknown" (desconocida)

* Campo obligatorio.

GET/api/invoice/get_detail

Consultar detalles de la NF-e

Devuelve los detalles de una NF-e específica por UUID o por clave de acceso. 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
uuidstringUUID de la NF-e
chavestringClave de acceso de la NF-e (44 dígitos)

Informe uuid o chave (al menos uno). Si se envían ambos, uuid tiene prioridad.

POST/api/invoice/refresh

Actualizar estado de la factura

Consulta el estado actual de la NF-e en la autoridad fiscal 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.

POST/api/invoice/cancel

Cancelar factura

Cancela una NF-e ya autorizada. La justificación enviada a la autoridad fiscal 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.

Campos de la respuesta (data)

CampoTipoDescripción
motivostringMensaje oficial de la autoridad fiscal que confirma la cancelación
statusstringSituación: "Canceled" (cancelada)
nfeintNúmero de la NF-e cancelada
serieintSerie de la NF-e
chavestringClave de acceso de 44 dígitos
modelostringModelo del documento: "nfe"
epecbooleanEmisión en contingencia EPEC
xmlstringURL del XML del evento de cancelación

Respuesta — error

Los fallos devuelven success: false con el mensaje de la autoridad fiscal en message, sin el objeto data. Ocurre cuando falta el uuid, el certificado es inválido, o la autoridad fiscal rechaza la cancelación (p. ej. plazo excedido, nota ya cancelada).
        {
          "success": false,
          "message": "Rejeição: NF-e já está cancelada na base de dados da autoridad fiscal"
        }
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 la autoridad fiscal 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 la autoridad fiscal)

* Campo obligatorio.

Campos de la respuesta (data)

CampoTipoDescripción
uuidstringIdentificador interno del registro de invalidación
xmlstringURL del XML de invalidación autorizado por la autoridad fiscal

Respuesta — error

Los fallos devuelven success: false con el mensaje de la autoridad fiscal en message, sin el objeto data. Ocurre cuando falta un campo obligatorio, el certificado es inválido, o la autoridad fiscal rechaza la invalidación (p. ej. rango ya invalidado).
        {
          "success": false,
          "message": "Rejeição: Faixa de numeração já inutilizada"
        }
POST/api/invoice/get_danfe

Obtener DANFE 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.

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 NF-e en lote

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, inclusivo (Unix timestamp en milisegundos). La fecha y hora UTC del valor se leen como hora de Brasilia: envíe la medianoche UTC del día, ej.: Date.UTC(2026, 7, 1) = 1785542400000 equivale a 01/08/2026 00:00 en Brasilia
end_create_timelongFin del período, exclusivo (misma regla). Envíe la medianoche UTC del día siguiente al último día deseado: para todo agosto de 2026, Date.UTC(2026, 8, 1) = 1788220800000

* Campo obligatorio.

Período: start_create_time/end_create_time se leen por su fecha y hora en UTC y se interpretan como hora de Brasilia (UTC−3, sin horario de verano). Envíe la medianoche UTC de los días calendario: inicio inclusivo, fin exclusivo. Ejemplo, del 29/08 al 01/09 de 2026 completos: start_create_time = 1787961600000 (2026-08-29T00:00Z) y end_create_time = 1788307200000 (2026-09-02T00:00Z). No sume 3 horas al valor.

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

Consulta el estado actual de una NF-e o NFC-e directamente en la autoridad fiscal 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).
ambientestringQué ambiente consultar: 1=producción, 2=homologación (también acepta producao/homologacao). Si se omite, se usa el ambiente en que se emitió la nota; producción si no se encuentra localmente. Son bases independientes: consultar producción por una nota emitida en homologación siempre devuelve 217.

* Campo obligatorio.

Campos de la respuesta

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

Mapeo de estados

statuscStat de la autoridad fiscalSignificado
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 la autoridad fiscal
inutilizada102Número inutilizado (rango de numeración)
nao_encontrada217NF-e no consta en la base de la autoridad fiscal
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
autoridad fiscal retornou resposta vaziaautoridad fiscal no devolvió respuesta (timeout, fuera del aire)
erro ao consultar autoridad fiscal: <detalle>Excepción al llamar al servicio (XML inválido, timeout, certificado expirado, etc.)
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 — la devolución es un clon integral de la NF-e original) o devolución parcial/personalizada (envía chave + los campos completos de la factura en el propio body, misma estructura que /api/invoice/create).

Headers obligatorios

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

Body — campos siempre leídos de la raíz

CampoTipoDescripción
uuidstringUUID de la NF-e original (devolución total; envíe este o chave). Es un GUID de 36 caracteres con guiones, no el _id de 24 caracteres. Con uuid y sin return_detail la nota se clona por completo; si también se envía return_detail, la devolución es parcial
chavestringClave de 44 dígitos de la NF-e original (obligatoria en la devolución parcial; alternativa a uuid en la devolución total)
return_detailobjectObjeto de detalle de la devolución parcial. Todos los campos de la devolución parcial deben ir dentro de este objeto (cliente, products, transaction_type, model, issuance_type, ambiente, id); dejarlos en la raíz devuelve error. chave, cfop y natureza_operacao siempre se leen de la raíz, y el natureza_operacao de la raíz sobrescribe al de dentro del objeto
cfop *stringCFOP de la devolución. La nota de devolución es de entrada (tpNF=0) y requiere CFOP de entrada: "1202", "1411" dentro del estado; "2202", "2411" interestatal. Si se omite, se usa "1202"/"2202" automáticamente. Enviar un CFOP de salida ("5202", "6202", ...) entra en conflicto con el tpNF y autoridad fiscal lo rechaza
natureza_operacaostringNaturaleza de la operación (ej.: "Devolução de venda"). Alias aceptado: nature_of_operation

Body — campos dentro de return_detail

Todos los campos siguientes van dentro del objeto return_detail. Colocarlos en la raíz de la petición no funciona: el endpoint devuelve error en lugar de caer silenciosamente en la devolución total.

CampoTipoDescripción
transaction_typestringTipo de operación. Obligatorio, pero el valor no tiene efecto: el endpoint lo sobrescribe incondicionalmente a entrada (tpNF=0), así que "0" y "1" se comportan igual — es solo un marcador
modelstringModelo del documento: "55" (obligatorio en la devolución parcial)
issuance_typestringTipo de emisión: "1"=normal (obligatorio en la devolución parcial)
ambientestringAmbiente: "1"=producción, "2"=homologación (obligatorio en la devolución parcial)
idstringNúmero de pedido (clave de deduplicación de la devolución). La devolución no usa el mecanismo de reserva de pedido, por lo que la protección contra duplicados depende por completo de este campo: si ya existe una devolución con el mismo id, se devuelve esa en lugar de emitir otra. Sin él no hay ninguna protección y la misma devolución puede emitirse repetidamente — muy recomendable
total_discount_amountnumberImporte de descuento total de la nota. Predeterminado 0
clienteobjectDatos del destinatario, misma estructura que /api/invoice/create (obligatorio en la devolución parcial). Particularidad: el campo del número de dirección es number (en inglés), no numero. Sin number, la dirección sale con nro "S/N"; el código IBGE, la ciudad y la UF se resuelven por el cep
productsarrayÍtems devueltos, misma estructura que /api/invoice/create (obligatorio en la devolución parcial). codigo es opcional — si falta, el cProd usa el name Datos tributarios mediante category_id o impostos — uno u otro; use el segundo cuando la factura original fue emitida por otro proveedor.
products[].n_itemintNúmero de ítem en la factura original (1..990). Solo homologación: allí la devolución referencia el original por ítem, y la devolución parcial no puede deducir ese número (el original puede no estar en esta plataforma). Sin él se omite el grupo de referencia y la autoridad fiscal devuelve Rejeição 321. En producción la referencia va en el encabezado y el campo no hace falta

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

Automático en la devolución: el pago sale como 90 (Sin Pago) — pag_info se ignora; natureza_operacao vacía usa "Devolução de Mercadoria"; la tributación de los ítems (CST/CSOSN, PIS/COFINS, IPI, IBS/CBS) proviene de la categoría fiscal del category_id, según tipo de persona y escenario, o se envía en línea por ítem mediante impostos — uno u otro.

Ejemplo Completo con Transporte

        {
          "nature_of_operation": "Venda de mercadoria",
          "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": "Rua Exemplo",
            "number": "123",
            "complemento": "Sala 45",
            "bairro": "Centro",
            "city": "São Paulo",
            "uf": "SP",
            "cep": "01234567",
            "telefone": "11999999999",
            "email": "contato@empresa.com"
          },
          "products": [
            {
              "codigo": "PROD001",
              "name": "Smartphone XYZ",
              "ncm": "85171210",
              "cest": "2804000",
              "count": 2,
              "unit": "matriz",
              "unit_price": 1500.00,
              "total_price": 3000.00,
              "category_id": "YOUR_CATEGORY_ID",
              "origem": "0",
              "indicador_total": "1"
            }
          ],
          "transportation": {
            "transport_mode": "0",
            "freight_amount": 30.00,
            "carrier_info": {
              "cnpj": "12345678000188",
              "name": "Transportadora Expressa",
              "endereco": "Rua da 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": "Rua do Remetente",
            "number": "100",
            "bairro": "Centro",
            "city": "São Paulo",
            "uf": "SP",
            "cep": "01001000"
          },
          "delivery_address": {
            "cnpj": "98765432000111",
            "name": "Destinatário Ltda",
            "endereco": "Rua do Destinatário",
            "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, 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": "YOUR_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": "YOUR_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).

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)
POST/api/invoice/create

Emitir NF-e complementaria

Headers obligatorios

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

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.
POST/api/invoice/create

Emitir NF-e de ajuste

Headers obligatorios

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

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)
POST/api/invoice/v2/create

Emitir NF-e (asíncrono)

El cuerpo de la solicitud y la validación son idénticos a /api/invoice/create. La diferencia es que no espera a la autoridad fiscal: tras la validación la solicitud entra en cola y se devuelve de inmediato el número de recepción task_id; la emisión se completa en segundo plano. Obtenga el resultado consultando /api/invoice/v2/task/get o recíbalo en la dirección de webhook configurada en el portal (vea “Webhook” abajo).

Cabeceras obligatorias

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

Body

Los campos son idénticos a /api/invoice/create (cliente, products[], pag_info…) y no se repiten aquí. Un callback_url en la solicitud se ignora: la dirección de retorno proviene solo de la configuración del portal.
CampoTipoDescripción
is_reopenbooleanReabrir / sobrescribir una NF-e ya emitida, mismo significado que en v1

Reglas de procesamiento

ReglaDescripción
IdempotenciaCuando se envía el id del pedido, solicitudes idénticas del mismo CNPJ en 5 minutos reutilizan la misma tarea y devuelven el mismo task_id sin volver a encolar; sin id no hay deduplicación.
LímiteComo máximo 100 tareas pendientes o en proceso por CNPJ por minuto; por encima la respuesta es Rate limit exceeded for this CNPJ.
Estadopending al aceptar, processing durante la ejecución, final success / failed.

Campos de la respuesta

CampoTipoDescripción
task_idstringNúmero de tarea, usado en la consulta y en la deduplicación del callback
idstringId del pedido enviado (vacío si no se informó)
statusstringEstado de la tarea, siempre pending al aceptar

Respuesta — rechazada

{ "success": false, "message": "Rate limit exceeded for this CNPJ, please slow down" }

Consulta estado y resultado por task_id. La ruta oficial es /api/invoice/v2/task/get; la ruta antigua /api/invoice/task/get sigue disponible con comportamiento y cobro idénticos. Solo se pueden consultar tareas de la propia cuenta; de lo contrario Task not found. Consulte cada 1–2 segundos; las tareas suelen terminar en segundos.

Cabeceras obligatorias

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

Body

CampoTipoDescripción
task_id *stringNúmero devuelto por /api/invoice/v2/create

status

EstadoSignificado
pendingAceptada, esperando procesamiento
processingEnviándose a la autoridad fiscal
successEmitida; la respuesta trae el mismo data que /api/invoice/create
failedLa emisión falló; message trae el motivo (rechazo de la autoridad fiscal cuando lo hay)
El status de primer nivel es el estado de la tarea (minúscula); en éxito, data.status es el estado del resultado de la emisión (p. ej. Success), idéntico a /api/invoice/create.

Cuando la tarea asíncrona llega al estado final, la plataforma envía una notificación a la dirección configurada por el integrador. Webhook y consulta pueden combinarse: use el callback como principal y la consulta como respaldo.

Configuración y requisitos de la dirección

  • Dirección de la cuenta: portal del integrador, “Cuenta → URL de Webhook”.
  • Dirección de la aplicación: configurada en la aplicación (clave de API) que gestiona la empresa, con suscripción opcional por endpoint; tiene prioridad sobre la dirección de la cuenta.
  • callback_url en la solicitud no se admite y se ignora.
  • La dirección debe ser http(s) pública, nunca red interna ni loopback; no se siguen redirecciones (3xx cuenta como fallo); timeout de 10 s; cualquier 2xx cuenta como entregado.

Momento de entrega y reintentos

  • Se entrega una vez inmediatamente después de que la tarea llegue a success / failed.
  • En fallo, se reintenta a +1 min, +10 min, +60 min, +4 h y +12 h, 6 intentos en total (unas 17 horas); después la entrega se detiene y /api/invoice/v2/task/get sigue disponible como respaldo.
  • Entrega al menos una vez; deduplique por task_id.

Mensaje (descifrado)

CampoTipoDescripción
task_idstringNúmero de tarea, clave de deduplicación
idstringId del pedido enviado
company_idintID de la empresa emisora
cnpjstringCNPJ de la empresa emisora
statusstringsuccess / failed
resultobjectEn éxito, el mismo objeto de respuesta que /api/invoice/create más data.danfe (URL del DANFE en PDF); null en fallo
errorstringMotivo del fallo, rechazo de la autoridad fiscal cuando lo hay; cadena vacía en éxito
testbooleanPresente y true solo en los mensajes del botón “Probar envío” del portal; deben ignorarse

{
  "task_id": "66d0a1b2c3d4e5f6a7b8c9d0",
  "id": "PED-1001",
  "company_id": 1263,
  "cnpj": "12345678000199",
  "status": "success",
  "result": {
    "success": true,
    "message": "成功",
    "data": {
      "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
      "status": "Success",
      "motivo": "Autorizado o uso da NF-e",
      "nfe": 100, "serie": 1,
      "chave": "35260112345678000199550010000001001000000017",
      "modelo": "nfe", "epec": false,
      "xml": "https://oss.example.com/.../chave.xml",
      "danfe": "https://oss.example.com/.../chave.pdf"
    }
  },
  "error": ""
}

Sobre cifrado

Los mensajes se entregan cifrados con AES-256-GCM. La clave se deriva de la clave de API del integrador, sin intercambiar ningún secreto adicional: key = SHA-256(UTF-8(token)), donde token es la clave de la aplicación que gestiona la empresa. GCM garantiza la integridad: alterar cualquier campo (incluido ts) hace fallar el descifrado, por lo que no se añade cabecera de firma.

Cabeceras: X-Webhook-Timestamp (Unix en segundos, igual al ts del sobre) y X-Webhook-Encryption: A256GCM. Si no se puede resolver ninguna clave el mensaje se envía en texto claro, sin la cabecera X-Webhook-Encryption; distinga ambos casos por esa cabecera.

Descifrado: nonce, payload y tag en Base64; los datos adicionales autenticados (AAD) son la cadena decimal de ts (UTF-8).

POST {webhook_url}
Content-Type: application/json
X-Webhook-Timestamp: 1786990396
X-Webhook-Encryption: A256GCM

{
  "enc": "A256GCM",
  "kid": "token",
  "ts": 1786990396,
  "nonce": "<base64, 12 bytes>",
  "payload": "<base64 ciphertext>",
  "tag": "<base64, 16 bytes>"
}

Ejemplo en Python (cryptography)

import base64, hashlib, json
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

def decrypt(token, body):
    env = json.loads(body)
    key = hashlib.sha256(token.encode("utf-8")).digest()
    aad = str(env["ts"]).encode("utf-8")
    data = base64.b64decode(env["payload"]) + base64.b64decode(env["tag"])
    plain = AESGCM(key).decrypt(base64.b64decode(env["nonce"]), data, aad)
    return json.loads(plain)

Ejemplo en Node.js

const crypto = require("crypto");

function decrypt(token, body) {
  const env = JSON.parse(body);
  const key = crypto.createHash("sha256").update(token, "utf8").digest();
  const d = crypto.createDecipheriv("aes-256-gcm", key, Buffer.from(env.nonce, "base64"));
  d.setAAD(Buffer.from(String(env.ts), "utf8"));
  d.setAuthTag(Buffer.from(env.tag, "base64"));
  const plain = Buffer.concat([d.update(Buffer.from(env.payload, "base64")), d.final()]);
  return JSON.parse(plain.toString("utf8"));
}

Pruebas de integración

  • El botón “Probar envío” junto a la URL de Webhook en el portal envía un mensaje de prueba cifrado (test: true) para validar conectividad y descifrado.
  • La bandeja de prueba del sistema (/webhook/inbox/{slot}, slot un identificador a su elección) también puede configurarse como URL de Webhook; los mensajes descifrados se ven en el portal.

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 la autoridad fiscal 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 autoridad fiscal: 15–1000 caracteres)
n_seq_eventointNúmero de secuencia del evento. De forma predeterminada se calcula a partir de las cartas de corrección ya registradas en esta plataforma. Indique un valor mayor cuando la factura ya haya recibido cartas de corrección en otro proveedor

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

Las facturas emitidas en otro proveedor también admiten carta de corrección: la carta es un evento independiente de la factura original y basta con que el número de identificación fiscal del emisor contenido en la clave de acceso pertenezca a una empresa de este token. Para estas facturas la plataforma no conserva el registro original, por lo que el número de secuencia no puede calcularse y se asume 1. Si la autoridad fiscal informa que ya existe un evento con ese número, reenvíe con un n_seq_evento mayor. Para estas facturas no se genera el PDF de la carta de corrección, solo el XML del evento.

POST/api/invoice/cce/get_list

Listar CC-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.

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.

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 la autoridad fiscal).

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.