APIs principales
NF-e
18 endpoints
/api/invoice/createEmitir 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Body — campos de nivel superior
| Campo | Tipo | Descripción |
|---|---|---|
| Identificación y operación | ||
| id | string | ID único del cliente para idempotencia (compone la clave de deduplicación) |
| nature_of_operation * | string | Naturaleza de la operación (ej.: "Venta de mercancía") |
| transaction_type * | string | Tipo: "0"=entrada, "1"=salida, "2"=importación, "3"=exportación |
| model * | string | Modelo del documento: "55"=NF-e |
| issuance_type * | string | Tipo de emisión ("1"=normal, "9"=contingencia, etc.) |
| ambiente * | string | "1"=producción, "2"=homologación |
| finalidade | string | Finalidad: "1"=normal, "2"=complementaria, "3"=ajuste, "4"=devolución |
| ref_nfe_chave | string | Clave de acceso de 44 dígitos de la NF-e referenciada (complementaria/ajuste/devolución) |
| is_reopen | boolean | Reabrir/sobrescribir una NF-e ya emitida |
| dh_sai_ent | string | Fecha/hora de salida o entrada (ISO 8601). Por defecto: timestamp actual |
| Importes y descuentos | ||
| total_discount_amount | decimal | Descuento total de la factura |
| price_includes_ipi | boolean | Si 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 |
| troco | decimal | Vuelto (típico en NFC-e) |
| seguro | decimal | Importe de seguro (prorrateado entre productos como vSeg en XML) |
| outras_despesas | decimal | Otros gastos (prorrateados entre productos como vOutro en XML) |
| Indicadores e información adicional | ||
| ind_final | string | Consumidor final: "0"=B2B, "1"=B2C |
| ind_pres | string | Indicador de presencia: "1"=presencial, "2"=internet, "3"=tele-atención, etc. |
| informacoes_complementares | string | Información complementaria (escrita en infAdic.infCpl) |
| informacoes_fisco | string | Información para el fisco (escrita en infAdic.infAdFisco) |
Body — cliente (objeto, obligatorio)
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.
| Campo | Tipo | Descripción |
|---|---|---|
| cpf | string | CPF del cliente (alternativa a cnpj) |
| cnpj | string | CNPJ del cliente (alternativa a cpf) |
| ie | string | Inscripción Estatal (Inscrição Estadual) |
| name * | string | Razón social / nombre del cliente |
| endereco | string | Dirección (calle) |
| complemento | string | Complemento de dirección |
| numero | string | Número de dirección |
| bairro | string | Barrio (mínimo 2 caracteres en operaciones nacionales) |
| city | string | Ciudad |
| uf | string | Estado (UF) — se sobrescribe con el UF resuelto desde el CEP |
| cep | string | Código postal (valida UF y ciudad) |
| telefone | string | Teléfono |
| string | Correo electrónico | |
| id_estrangeiro | string | ID extranjero (uso en importación/exportación) |
| c_pais | int | Código BACEN del país. Por defecto: 1058 (Brasil) |
| x_pais | string | Nombre del país. Por defecto: "BRASIL" |
Body — products[] (array, mínimo 1 elemento)
category_id (referencia a una categoría fiscal pre-registrada), o el objeto impostos con la configuración en línea.
| Campo | Tipo | Descripción |
|---|---|---|
| codigo | string | Código interno del producto |
| name * | string | Descripción del producto (los caracteres CJK se eliminan) |
| ncm * | string | NCM con 8 dígitos |
| cest | string | Código CEST (obligatorio cuando aplica ICMS-ST) |
| gtin | string | GTIN / código de barras |
| gtin_tributavel | string | GTIN de la unidad tributable |
| count * | decimal | Cantidad |
| unit * | string | Unidad comercial (ej.: "UN", "KG", "MT") |
| unit_price * | decimal | Precio unitario |
| total_price * | decimal | Valor total del ítem |
| discount_price | decimal | Descuento aplicado al ítem |
| price_includes_ipi | boolean | Sobrescribe price_includes_ipi para este producto; omítalo para seguir la configuración de la factura |
| origem * | int | Origen de la mercancía (0=Nacional, 1=Extranjera — importación directa, etc.) |
| indicador_total * | int | Compone el total de la NF-e: 0=no, 1=sí |
| category_id | string | ID de categoría fiscal pre-registrada (obligatorio si no envía impostos) |
| impostos | object | Configuración de tributos en línea (alternativa a category_id). Vea la estructura abajo. El nombre anterior tax_info sigue siendo aceptado. |
| disable_difal | boolean | Desactiva el cálculo de DIFAL para este ítem |
| desconta_icms_pis_cofins | boolean | Descuenta el ICMS antes de calcular PIS/COFINS — tributa (importe − ICMS), estándar actual en Brasil; por defecto false (sin descuento, impuesto mayor) |
| ii | object | Impuesto de Importación — obligatorio para CFOP 3.xxx. Vea la estructura abajo |
| import_declarations | array | Declaraciones de Importación (DI) — obligatorio cuando transaction_type="2". Vea la estructura abajo |
| nItemPed | int | Í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
| Campo | Tipo | Descripción |
|---|---|---|
| industria | string | Industria/alícuota base (alias: aliquota) |
| icms | ||
| icms.codigo_cfop | string | CFOP |
| icms.situacao_tributaria | string | CST/CSOSN del ICMS |
| icms.tipo_pessoa | string | Tipo de persona (PF/PJ) |
| icms.codigo_beneficio_fiscal | string | cBenef (código de beneficio fiscal) |
| icms.aliquota | string | Alí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_reducao | string | Porcentaje de reducción de la base del ICMS propio (CST 20, 51, 70, 90) |
| icms.aliquota_st | string | Alícuota del ICMS-ST del estado de destino en % (CST 10, 30, 70, 90) |
| icms.aliquota_reducao_st | string | Porcentaje de reducción de la base del ICMS-ST (CST 10, 30, 70, 90) |
| icms.aliquota_mva | string | MVA/IVA-ST en % (CST 10, 30, 70, 90) |
| icms.aliquota_fcp | string | Alícuota del FCP propio en % — emite pFCP/vFCP en el grupo ICMS (CST 00, 10, 20, 51, 70, 90) |
| icms.aliquota_fcp_st | string | Alícuota del FCP-ST en % (CST 10, 30, 70, 90) |
| icms.aliquota_fcp_uf_dest | string | Alícuota del FCP del estado de destino (pFCPUFDest). Si se omite, usa aliquota_fcp |
| icms.aliquota_uf_dest | string | Alí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_inter | boolean | Resta 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_dentro | boolean | Amplí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_dest | string | Si ya calculó la base del DIFAL, indique el importe (R$) aquí. Las dos opciones anteriores dejan de aplicarse |
| icms.aliquota_credito | string | Alícuota de crédito del Simples Nacional en % (CSOSN 101, 201, 900) |
| icms.aliquota_diferimento | string | Porcentaje de diferimiento del ICMS (CST 51) |
| icms.motivo_desoneracao | string | Código del motivo de exoneración del ICMS (CST 20, 40, 41, 50, 90) |
| icms.ad_rem_icms | string | ICMS monofásico — alícuota ad rem en R$/unidad (CST 02, 15, 53) |
| icms.ad_rem_icms_ret | string | ICMS monofásico — ad rem retenido en R$/unidad (CST 15, 61) |
| icms.p_dif_mono | string | ICMS monofásico — porcentaje de diferimiento (CST 53) |
| icms.q_bc_mono | string | ICMS monofásico — cantidad tributada (litros/kg). Vacío usa la cantidad del ítem (CST 02, 15, 53) |
| icms.valor_desoneracao | string | Valor del ICMS exonerado en BRL — emite vICMSDeson (CST 40, 41, 50, 90) |
| icms.v_bc_st_ret | string | Base de cálculo del ICMS-ST retenido en la operación anterior (informado, no calculado — CST 60, CSOSN 500) |
| icms.p_st | string | Alícuota soportada por el consumidor final en % (informado, no calculado — CST 60, CSOSN 500) |
| icms.v_icms_st_ret | string | Valor del ICMS-ST retenido en la operación anterior (informado, no calculado — CST 60, CSOSN 500) |
| icms.v_icms_substituto | string | Valor del ICMS propio del sustituto (informado, no calculado — CST 60, CSOSN 500) |
| icms.v_bc_fcp_st_ret | string | Base de cálculo del FCP retenido por ST (informado, no calculado — CST 60, CSOSN 500) |
| icms.p_fcp_st_ret | string | Alícuota del FCP retenido por ST en % (informado, no calculado — CST 60, CSOSN 500) |
| icms.v_fcp_st_ret | string | Valor del FCP retenido por ST (informado, no calculado — CST 60, CSOSN 500) |
| ipi | ||
| ipi.codigo_enquadramento | string | Código de encuadre legal del IPI |
| ipi.situacao_tributaria | string | CST IPI |
| ipi.aliquota | string | Alícuota IPI |
| ipi.valor_unidade | string | IPI 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_pessoa | string | Tipo de persona |
| pis | ||
| pis.situacao_tributaria | string | CST PIS |
| pis.aliquota | string | Alícuota PIS |
| pis.valor_unidade | string | PIS por cantidad — valor en R$/unidad. vPIS = cantidad × valor (CST 03 y demás formas por cantidad) |
| pis.tipo_pessoa | string | Tipo de persona |
| cofins | ||
| cofins.situacao_tributaria | string | CST COFINS |
| cofins.aliquota | string | Alícuota COFINS |
| cofins.valor_unidade | string | COFINS por cantidad — valor en R$/unidad. vCOFINS = cantidad × valor (CST 03 y demás formas por cantidad) |
| cofins.tipo_pessoa | string | Tipo de persona |
| is (Impuesto Selectivo) | ||
| is.cenario | string | Escenario IS |
| is.situacao_tributaria | string | CST IS |
| is.aliquota | string | Alícuota IS |
| is.tipo_pessoa | string | Tipo de persona |
| ibs_cbs (Reforma Tributaria) | ||
| ibs_cbs.situacao_tributaria | string | CST IBS/CBS |
| ibs_cbs.tipo_pessoa | string | Tipo de persona |
| ibs_cbs.classificacao_tributaria | string | Clasificación tributaria IBS/CBS |
| ibs_cbs.p_ibs_uf | string | Alí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_mun | string | Alícuota del IBS municipal en % (opcional; por defecto 0 en 2026) |
| ibs_cbs.p_cbs | string | Alícuota de la CBS en % (opcional; por defecto 0,90 en 2026) |
| ibs_cbs.p_red_aliq | string | Porcentaje de reducción de alícuota (CST 011, 200, 515) |
| ibs_cbs.p_dif | string | Porcentaje de diferimiento (CST 510, 515) |
| ibs_cbs.p_red_bc | string | Porcentaje de reducción de la base de cálculo (CST 222) |
| ibs_cbs.proporcao | string | Proporción de la operación en % (CST 221) |
| ibs_cbs.aliquota_cbs_mono | string | CBS monofásica — alícuota en % sobre la base; prevalece sobre valor_unidade_cbs (CST 620) |
| ibs_cbs.aliquota_ibs_mono | string | IBS monofásico — alícuota en % sobre la base; prevalece sobre valor_unidade_ibs (CST 620) |
| ibs_cbs.valor_unidade_cbs | string | CBS monofásica — ad rem en R$/unidad; solo se usa cuando no hay alícuota porcentual (CST 620) |
| ibs_cbs.valor_unidade_ibs | string | IBS monofásico — ad rem en R$/unidad; solo se usa cuando no hay alícuota porcentual (CST 620) |
| ibs_cbs.valor_deducao_legal | string | Valor de la deducción legal de la base en R$ (CST 830) |
| difal | ||
| difal.disable_difal | boolean | Desactiva 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 destinatario | Enviar además de aliquota, aliquota_fcp |
|---|---|
| PE, RJ | nada más |
| SE | solo 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: truedifal_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 enviar | Base del DIFAL | DIFAL a pagar |
|---|---|---|
| sin difal_desconta_icms_inter ni difal_base_por_dentro | 100,00 | 16,50 |
| ambos en true | 122,29 | 21,07 |
| v_bc_uf_dest=150 | 150,00 | 26,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)
| Campo | Tipo | Descripción |
|---|---|---|
| vBC | decimal | Base de cálculo del II |
| vDespAdu | decimal | Gastos aduaneros |
| vII | decimal | Valor del II |
| vIOF | decimal | Valor del IOF |
Body — products[].import_declarations[]
| Campo | Tipo | Descripción |
|---|---|---|
| nDI | string | Número de DI |
| dDI | string (date) | Fecha de DI |
| xLocDesemb | string | Lugar de desaduanaje |
| UFDesemb | string | UF de desaduanaje |
| dDesemb | string (date) | Fecha de desaduanaje |
| cExportador | string | Código del exportador |
| tpViaTransp | int | Vía de transporte internacional |
| tpIntermedio | int | Tipo de intermediación |
| vAFRMM | decimal | Valor del AFRMM |
| additions | array | Adiciones 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.
| Campo | Tipo | Descripción |
|---|---|---|
| cpf | string | CPF (alternativa a cnpj) |
| cnpj | string | CNPJ (alternativa a cpf) |
| ie | string | Inscripción Estatal |
| name * | string | Razón social / nombre |
| endereco * | string | Dirección |
| complemento | string | Complemento |
| number | string | Número (atención: el campo es number, no numero) |
| bairro * | string | Barrio |
| city * | string | Ciudad |
| uf * | string | Estado |
| cep * | string | Código postal |
| telefone | string | Teléfono |
| string | Correo electrónico |
Body — transportation (objeto, opcional)
transportation se omite, el sistema asume transport_mode="9" (sin flete).
| Campo | Tipo | Descripción |
|---|---|---|
| transport_mode | string | Modalidad 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_amount | decimal | Valor total del flete |
| carrier_info — transportista | ||
| carrier_info.cpf | string | CPF del transportista (alternativa a cnpj) |
| carrier_info.cnpj | string | CNPJ del transportista (alternativa a cpf) |
| carrier_info.ie | string | Inscripción Estatal |
| carrier_info.name | string | Razón social |
| carrier_info.endereco | string | Dirección |
| carrier_info.city | string | Ciudad |
| carrier_info.uf | string | Estado |
| carrier_info.cep | string | Código postal |
| vehicle_info — vehículo | ||
| vehicle_info.plate | string | Placa |
| vehicle_info.uf | string | UF de la placa |
| vehicle_info.rntc | string | RNTC (Registro Nacional de Transportistas de Carga) |
| trailer_info — remolque (misma estructura que vehicle_info) | ||
| trailer_info.plate | string | Placa del remolque |
| trailer_info.uf | string | UF |
| trailer_info.rntc | string | RNTC |
| packages[] — volúmenes | ||
| packages[].qty | int | Cantidad |
| packages[].gross_weight | decimal | Peso bruto |
| packages[].net_weight | decimal | Peso neto |
| packages[].packaging_type | string | Especie |
| packages[].number | string | Numeración |
| packages[].mark | string | Marca |
| packages[].seals | array<string> | Precintos |
| transport_tax_retention_info — retención de ICMS sobre flete | ||
| transport_tax_retention_info.freight_service_amount | decimal | Valor del servicio de transporte |
| transport_tax_retention_info.tax_base | decimal | Base de cálculo de la retención |
| transport_tax_retention_info.tax_rate | decimal | Alícuota de la retención |
| transport_tax_retention_info.cfop | string | CFOP |
| transport_tax_retention_info.cep | string | Código postal |
Body — pag_info[] (array, opcional)
[{ "payment_method": "01", "payment_indicator": "0" }] (efectivo, al contado).
| Campo | Tipo | Descripción |
|---|---|---|
| payment_method * | string | Forma 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 * | string | Indicador: "0"=al contado, "1"=a plazo |
| payment_value | decimal | Importe pagado |
| card_info — datos de la tarjeta (para payment_method 03/04) | ||
| card_info.integration_type * | string | Tipo de integración de la terminal (obligatorio si card_info está presente) |
| card_info.brand_code * | string | Marca de la tarjeta (obligatorio si card_info está presente) |
| card_info.acquirer_cnpj | string | CNPJ de la adquirente |
| card_info.authorization_code | string | Código de autorización |
* Campo obligatorio.
Campos de la respuesta (data)
| Campo | Tipo | Descripción |
|---|---|---|
| uuid | string | Identificador interno de la NF-e. Úselo en las consultas siguientes (/api/invoice/get_detail, /refresh, /cancel) |
| status | string | Situación: "Success" (autorizada), "Failed" (rechazada/fallo), "Processing" (en procesamiento), "Canceled" (cancelada) |
| motivo | string | Mensaje oficial de la autoridad fiscal según el cStat (formato bilingüe PT / 中文) |
| nfe | int | Número de la NF-e emitida |
| serie | int | Serie de la NF-e |
| chave | string | Clave de acceso de 44 dígitos (vacía cuando la nota no fue autorizada) |
| modelo | string | Modelo del documento: "nfe" |
| epec | boolean | Emisión en contingencia EPEC |
| xml | string | URL del XML autorizado. El DANFE (PDF) y demás formatos se obtienen en /api/invoice/get_detail |
Respuesta — rechazo / error
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": ""
}
}/api/invoice/get_listListar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 (path incluye la query string) |
| timestamp | string | Unix timestamp en segundos |
Query string
| Parámetro | Tipo | Descripción |
|---|---|---|
| page * | int | Número de página (≥ 1) |
| page_size * | int | Tamaño de página (1–50) |
| start_create_time | long | Unix timestamp en milisegundos — inicio (requiere end_create_time) |
| end_create_time | long | Unix timestamp en milisegundos — fin |
| status | string | Filtrar 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.
/api/invoice/get_detailConsultar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 (path incluye la query string) |
| timestamp | string | Unix timestamp en segundos |
Query string
| Parámetro | Tipo | Descripción |
|---|---|---|
| uuid | string | UUID de la NF-e |
| chave | string | Clave de acceso de la NF-e (44 dígitos) |
Informe uuid o chave (al menos uno). Si se envían ambos, uuid tiene prioridad.
/api/invoice/refreshActualizar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| uuid * | string | UUID de la NF-e a consultar |
* Campo obligatorio.
/api/invoice/cancelCancelar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| uuid * | string | UUID de la NF-e a cancelar (identificador interno devuelto por /api/invoice/create) |
* Campo obligatorio.
Campos de la respuesta (data)
| Campo | Tipo | Descripción |
|---|---|---|
| motivo | string | Mensaje oficial de la autoridad fiscal que confirma la cancelación |
| status | string | Situación: "Canceled" (cancelada) |
| nfe | int | Número de la NF-e cancelada |
| serie | int | Serie de la NF-e |
| chave | string | Clave de acceso de 44 dígitos |
| modelo | string | Modelo del documento: "nfe" |
| epec | boolean | Emisión en contingencia EPEC |
| xml | string | URL del XML del evento de cancelación |
Respuesta — error
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"
}/api/invoice/invalidInutilizar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| modelo * | string | Modelo 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 * | int | Serie de la numeración a inutilizar |
| start_number * | int | Número inicial del rango |
| end_number * | int | Número final del rango |
| motivo * | string | Justificación de la inutilización (mínimo 15 caracteres por exigencia de la autoridad fiscal) |
* Campo obligatorio.
Campos de la respuesta (data)
| Campo | Tipo | Descripción |
|---|---|---|
| uuid | string | Identificador interno del registro de invalidación |
| xml | string | URL del XML de invalidación autorizado por la autoridad fiscal |
Respuesta — error
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"
}/api/invoice/get_danfeObtener 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| uuid ⚠ | string | UUID interno de la NF-e (devuelto por /api/invoice/create) |
| chave ⚠ | string | Clave de acceso de la NF-e (44 dígitos) |
⚠ uuid o chave, uno de los dos es obligatorio.
Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| danfe | string | URL del PDF del DANFE completo (formato A4) |
| danfe_simples | string | URL del PDF del DANFE simplificado (formato cupón) |
| danfe_simples_png | string | URL del PNG del DANFE simplificado (etiqueta/imagen) |
Respuestas de error
| Mensaje | Causa |
|---|---|
| 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 |
/api/invoice/get_xmlExportar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| type * | string | Formato de salida: "excel" (hoja de metadatos) o cualquier otro valor (ej.: "xml") para ZIP con XMLs |
| status | string | Filtra por estado de la factura (ej.: "Success", "Canceled", "Voided"). Para type=excel, se convierte a minúsculas |
| month | int | Mes (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_time | long | Inicio 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_time | long | Fin 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.
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
| Campo | Tipo | Descripción |
|---|---|---|
| status | string | "Processing" mientras se ejecuta, "Success" cuando el archivo está listo |
| progress_count | int | Cantidad de facturas ya procesadas |
| total_count | int | Total de facturas a procesar |
| url | string | URL de descarga del archivo final (vacío mientras status = Processing) |
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
| Mensaje | Causa |
|---|---|
| 发票类型字段不能为空 | type ausente |
/api/invoice/consultar_statusConsultar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa (cuyo certificado se usará en la consulta) |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| chave * | string | Clave 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). |
| ambiente | string | Qué 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
| Campo | Tipo | Descripción |
|---|---|---|
| chave | string | Clave de acceso consultada |
| status | string | Estado normalizado (ver tabla abajo) |
| cstat | int | Código cStat bruto de la autoridad fiscal |
| motivo | string | Mensaje xMotivo bruto de la autoridad fiscal |
Mapeo de estados
status | cStat de la autoridad fiscal | Significado |
|---|---|---|
| autorizada | 100, 150 | NF-e autorizada para uso |
| cancelada | 101, 151 | Cancelada (también devuelto si hay un evento de cancelación vinculado, incluso con cStat=100) |
| denegada | 110, 301, 302 | Uso denegado por la autoridad fiscal |
| inutilizada | 102 | Número inutilizado (rango de numeración) |
| nao_encontrada | 217 | NF-e no consta en la base de la autoridad fiscal |
| desconhecido | otros | cStat no mapeado — consulte cstat y motivo brutos |
Respuestas de error
| Mensaje | Causa |
|---|---|
| chave inválida: deve ter 44 dígitos | Clave ausente, con tamaño diferente de 44 o conteniendo caracteres no numéricos |
| empresa não possui certificado configurado | La empresa del token no tiene cert_file registrado |
| autoridad fiscal retornou resposta vazia | autoridad 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.) |
/api/invoice/returnEmitir 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body — campos siempre leídos de la raíz
| Campo | Tipo | Descripción |
|---|---|---|
| uuid | string | UUID 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 |
| chave | string | Clave de 44 dígitos de la NF-e original (obligatoria en la devolución parcial; alternativa a uuid en la devolución total) |
| return_detail | object | Objeto 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 * | string | CFOP 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_operacao | string | Naturaleza 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.
| Campo | Tipo | Descripción |
|---|---|---|
| transaction_type | string | Tipo 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 |
| model | string | Modelo del documento: "55" (obligatorio en la devolución parcial) |
| issuance_type | string | Tipo de emisión: "1"=normal (obligatorio en la devolución parcial) |
| ambiente | string | Ambiente: "1"=producción, "2"=homologación (obligatorio en la devolución parcial) |
| id | string | Nú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_amount | number | Importe de descuento total de la nota. Predeterminado 0 |
| cliente | object | Datos 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 |
| products | array | Í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_item | int | Nú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"
}
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"
}
]
}
transaction_type: "2"— operación de entrada (importación).clientesincnpj/cpf/uf/cep; usaid_estrangeiro,c_pais(tabla BACEN — China = 1600) yx_pais.category_iddebe apuntar a una categoría fiscal con CFOP 3.xxx y CST/CSOSN compatibles con importación.origemdel producto =1(extranjera — importación directa) o2(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. vAFRMMes obligatorio cuandotpViaTransp = 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.
- 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
- 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
- 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:
| Header | Tipo | Descripcion |
|---|---|---|
| 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) |
/api/invoice/createEmitir NF-e complementaria
Headers obligatorios
| Header | Tipo | Descripcion |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos especificos
| Campo | Tipo | Descripcion |
|---|---|---|
| finalidade | string | "2" para Complementaria (obligatorio) |
| ref_nfe_chave | string | Clave de acceso de la factura original — 44 digitos (obligatorio) |
/api/invoice/create para emision normal. Consulte la documentacion de emision de NFe para detalles de todos los campos.
"90" (Sin Pago) pues se trata solo de complemento de valores fiscales.
/api/invoice/createEmitir NF-e de ajuste
Headers obligatorios
| Header | Tipo | Descripcion |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos especificos
| Campo | Tipo | Descripcion |
|---|---|---|
| finalidade | string | "3" para Ajuste (obligatorio) |
| ref_nfe_chave | string | Clave de acceso de la factura original — 44 digitos (obligatorio) |
| Valor | Descripcion |
|---|---|
| 1 | Normal (predeterminado) |
| 2 | Complementaria |
| 3 | Ajuste |
| 4 | Devolucion |
- 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)
/api/invoice/v2/createEmitir 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
| Campo | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
/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.| Campo | Tipo | Descripción |
|---|---|---|
| is_reopen | boolean | Reabrir / sobrescribir una NF-e ya emitida, mismo significado que en v1 |
Reglas de procesamiento
| Regla | Descripción |
|---|---|
| Idempotencia | Cuando 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ímite | Como máximo 100 tareas pendientes o en proceso por CNPJ por minuto; por encima la respuesta es Rate limit exceeded for this CNPJ. |
| Estado | pending al aceptar, processing durante la ejecución, final success / failed. |
Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| task_id | string | Número de tarea, usado en la consulta y en la deduplicación del callback |
| id | string | Id del pedido enviado (vacío si no se informó) |
| status | string | Estado de la tarea, siempre pending al aceptar |
Respuesta — rechazada
{ "success": false, "message": "Rate limit exceeded for this CNPJ, please slow down" }
/api/invoice/v2/task/getConsultar resultado de la emisión asíncrona
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
| Campo | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| task_id * | string | Número devuelto por /api/invoice/v2/create |
status
| Estado | Significado |
|---|---|
| pending | Aceptada, esperando procesamiento |
| processing | Enviándose a la autoridad fiscal |
| success | Emitida; la respuesta trae el mismo data que /api/invoice/create |
| failed | La emisión falló; message trae el motivo (rechazo de la autoridad fiscal cuando lo hay) |
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_urlen 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/getsigue disponible como respaldo. - Entrega al menos una vez; deduplique por
task_id.
Mensaje (descifrado)
| Campo | Tipo | Descripción |
|---|---|---|
| task_id | string | Número de tarea, clave de deduplicación |
| id | string | Id del pedido enviado |
| company_id | int | ID de la empresa emisora |
| cnpj | string | CNPJ de la empresa emisora |
| status | string | success / failed |
| result | object | En éxito, el mismo objeto de respuesta que /api/invoice/create más data.danfe (URL del DANFE en PDF); null en fallo |
| error | string | Motivo del fallo, rechazo de la autoridad fiscal cuando lo hay; cadena vacía en éxito |
| test | boolean | Presente 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},slotun 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.
- 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
- 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
- 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:
| Header | Tipo | Descripcion |
|---|---|---|
| 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) |
/api/invoice/cce/sendEnviar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| uuid | string | UUID de la NF-e (obligatorio si chave está ausente) |
| chave | string | Clave de 44 dígitos de la NF-e (obligatorio si uuid está ausente) |
| correcao * | string | Texto de la corrección (límite autoridad fiscal: 15–1000 caracteres) |
| n_seq_evento | int | Nú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.
/api/invoice/cce/get_listListar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| uuid | string | UUID de la NF-e (obligatorio si chave está ausente) |
| chave | string | Clave de 44 dígitos de la NF-e (obligatorio si uuid está ausente) |
Al menos uno entre uuid y chave es obligatorio.
/api/invoice/cce/download_pdfDescargar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| cce_id * | string | ID de la CC-e (ObjectId) devuelto por /api/invoice/cce/get_list en el campo id |
* Campo obligatorio.
/api/invoice/cce/download_xmlDescargar 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
| Header | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa emisora |
| sign | string | Firma MD5 |
| timestamp | string | Unix timestamp en segundos |
Body
| Campo | Tipo | Descripción |
|---|---|---|
| cce_id * | string | ID de la CC-e (ObjectId) devuelto por /api/invoice/cce/get_list en el campo id |
* Campo obligatorio.