{
"orderCode": "EC-K004-42-1786579046934",
"createdAt": "2026-08-12T17:26:09.386Z",
"operation": "INVOICE",
"store": { "code": "K004" },
"device": { "uid": "kiosk-01", "name": "KIOSK", "platform": "android" },
"totals": [
{
"currencyCode": "USD",
"total": 10,
"subtotalWithoutTaxes": 8.7,
"taxValue": 1.3,
"taxes": [
{ "name": "IVA", "base": 8.7, "rate": "0.15", "amount": 1.3 }
]
}
],
"client": {
"uid": "8Z35YvBbgKVj67AJwZ3nFmAqrtk1",
"name": "CONSUMIDOR",
"lastName": "FINAL",
"email": "consumidor.final@kfc.com.ec",
"phone": "2222222",
"govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000",
"externalId": "",
"additionalInfo": {
"fiscal": "",
"gender": "",
"birthdate": ""
},
"billingInformation": {
"email": "",
"phone": "2222222",
"address": "",
"govIdType": "FINAL_CONSUMER",
"externalId": "",
"govIdNumber": "00000000000",
"businessName": ""
}
},
"metadata": {}
}
{
"orderCode": "CO-K039-1786901234",
"createdAt": "2026-08-16T14:03:22.145Z",
"operation": "INVOICE",
"store": { "code": "K039" },
"device": { "uid": "52CAEA5A18D9B75F", "name": "CAJA 3", "platform": "android" },
"client": {
"name": "Consumidor",
"lastName": "final",
"govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000"
},
"totals": [
{
"currencyCode": "COP",
"total": 50000,
"subtotalWithoutTaxes": 42016.81,
"taxValue": 7983.19,
"taxes": [
{ "name": "IVA", "base": 42016.81, "rate": "0.19", "amount": 7983.19 }
]
}
],
"metadata": {}
}
{
"orderCode": "EC-K004-42-1786579046934",
"createdAt": "2026-08-12T19:10:00.000Z",
"operation": "CANCEL",
"store": { "code": "K004" },
"device": { "uid": "kiosk-01", "name": "KIOSK", "platform": "android" },
"client": {
"uid": "8Z35YvBbgKVj67AJwZ3nFmAqrtk1",
"name": "CONSUMIDOR",
"lastName": "FINAL",
"email": "consumidor.final@ejemplo.com",
"phone": "2222222",
"govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000",
"externalId": "",
"additionalInfo": { "fiscal": "", "gender": "", "birthdate": "" },
"billingInformation": {
"email": "", "phone": "2222222", "address": "",
"govIdType": "FINAL_CONSUMER", "externalId": "",
"govIdNumber": "00000000000", "businessName": ""
}
},
"totals": [
{
"currencyCode": "USD",
"total": 10,
"subtotalWithoutTaxes": 8.7,
"taxValue": 1.3,
"taxes": [
{ "name": "IVA", "base": 8.7, "rate": "0.15", "amount": 1.3 }
]
}
],
"metadata": {}
}
{
"success": true,
"data": {
"fiscalRequestId": "8d5b425c-87d2-4848-ab74-517a0ca2743e",
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": {
"documentType": "SALE_INVOICE",
"documentLabel": "FACTURA",
"documentNumber": "005-004-000000011",
"authorizationMode": "ONLINE",
"authorizationLabel": "EMISION NORMAL",
"issuedAt": "2026-08-12T23:57:47.118Z",
"compensates": null
},
"countryData": {
"numeroComprobante": "005-004-000000011",
"claveAcceso": "1208202601000000000000110050040000000111234567811",
"establecimiento": "005",
"puntoEmision": "004",
"secuencial": "000000011",
"ambiente": "PRODUCCION"
},
"store": {
"code": "K004", "name": "Sucursal Amazonas",
"address": "AV. AMAZONAS N36-15", "city": "Quito", "phone": "022222222",
"govIdType": "RUC", "govIdNumber": "1791415132001",
"secondaryGovIdType": null, "secondaryGovIdNumber": null
},
"company": {
"legalName": "INT FOOD SERVICES CORP SA",
"tradeName": "KFC",
"govIdType": "RUC",
"govIdNumber": "1791415132001",
"headquartersAddress": "PICHINCHA / QUITO / INAQUITO / COREA 126 Y AV. AMAZONAS",
"countryLines": [
{ "key": "granContribuyente", "label": "GRAN CONTRIBUYENTE", "value": "NAC-GCFOIOC21-00000900-E" },
{ "key": "contribuyenteEspecial", "label": "CONTRIBUYENTE ESPECIAL", "value": "155" },
{ "key": "obligadoContabilidad", "label": "Obligado a llevar contabilidad", "value": "SI" }
],
"legends": [
{ "key": "avisoCambios", "text": "Estimado cliente: Por favor verifique los datos de su factura…" }
]
},
"graphic": { "qr": "1208202601000000000000110050040000000111234567811" },
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "GENERATED" }
},
"cancellation": null
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"failure": null,
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": { "deviceUid": "4B8E21F9A0D35C7A", "externalStoreCode": "K000" }
}
}
{
"success": true,
"data": {
"fiscalRequestId": "c1a7f0e2-9b34-4d21-8e55-3f60ab12cd90",
"orderCode": "CO-K039-1786901234",
"idempotencyKey": "2f81dcb4-77a0-4c19-9e3b-5a04e7f1b2c8",
"reused": false,
"countryCode": "CO",
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": {
"documentType": "SALE_INVOICE",
"documentLabel": "FACTURA ELECTRONICA DE VENTA",
"documentNumber": "SETP990000001",
"authorizationMode": "ONLINE",
"authorizationLabel": "VALIDACION PREVIA",
"issuedAt": "2026-08-16T14:21:03.118Z",
"compensates": null
},
"countryData": {
"numeroComprobante": "SETP990000001",
"cufe": "9c4f1e… (96 caracteres hexadecimales)",
"prefijo": "SETP",
"numeroDian": "990000001",
"qrCode": "https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey=9c4f1e…",
"ambiente": "PRODUCCION"
},
"store": {
"code": "K039", "name": "Sucursal Chapinero",
"address": "CRA 13 # 63-39", "city": "Bogotá", "phone": "6013334444",
"govIdType": "NIT", "govIdNumber": "9001234567",
"secondaryGovIdType": null, "secondaryGovIdNumber": null
},
"company": {
"legalName": "COMERCIALIZADORA ANDINA S.A.S.",
"tradeName": "KFC",
"govIdType": "NIT",
"govIdNumber": "9001234567",
"headquartersAddress": "BOGOTA D.C. / CHAPINERO / CRA 13 # 63-39",
"countryLines": [
{ "key": "regimen", "label": "REGIMEN", "value": "RESPONSABLE DE IVA" },
{ "key": "resolucion", "label": "RESOLUCION DIAN", "value": "18760000001" }
],
"legends": []
},
"graphic": null,
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "GENERATED" }
},
"cancellation": null
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"failure": null,
"timestamps": {
"requestedAt": "2026-08-16T14:21:02.6Z",
"respondedAt": "2026-08-16T14:21:03.3Z",
"providerLatencyMs": 712
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": { "externalStoreCode": "K039" }
}
}
{
"success": true,
"data": {
"fiscalRequestId": "b73b2fd9-c7a6-42bd-815f-d39c210983ef",
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": "1e07b0e1-784b-40b9-8903-0326361ebefd",
"reused": false,
"countryCode": "EC",
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": {
"documentType": "CREDIT_NOTE",
"documentLabel": "NOTA DE CREDITO RIDE",
"documentNumber": "005-004-000000002",
"authorizationMode": "ONLINE",
"authorizationLabel": "EMISION NORMAL",
"issuedAt": "2026-08-14T18:32:32.242Z",
"compensates": {
"documentNumber": "005-004-000000068",
"issuedAt": "2026-08-14T18:31:57.649Z",
"reason": "ORDER_CANCELLATION",
"reasonLabel": "Anulación de pedido"
}
},
"countryData": {
"numeroComprobante": "005-004-000000002",
"claveAcceso": "1408202604179141513200110050040000000021234567815",
"establecimiento": "005",
"puntoEmision": "004",
"secuencial": "000000002",
"ambiente": "PRODUCCION"
},
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "GENERATED" }
},
"cancellation": {
"canCancel": true,
"outcome": "ALLOW",
"code": null,
"reason": null,
"reasonDetail": null,
"source": "default",
"threshold": null,
"resolvedAt": "2026-08-21T21:59:56.100Z",
"resolvedFrom": {
"orderStatus": "COMPLETED",
"fiscalStatus": "authorized",
"countryCode": "EC",
"isFinalConsumer": "false",
"minutesSinceAuthorization": "4"
}
}
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"graphic": { "qr": "1408202604179141513200110050040000000021234567815" },
"failure": null,
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": { "deviceUid": "4B8E21F9A0D35C7A", "externalStoreCode": "K000" }
}
}
{
"success": true,
"data": {
"fiscalRequestId": null,
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": null,
"reused": false,
"countryCode": "EC",
"requestStatus": "BLOCKED_BY_POLICY",
"documentStatus": null,
"retryable": false,
"environment": null,
"document": null,
"countryData": null,
"store": {
"code": "K004", "name": "Sucursal Amazonas",
"address": "AV. AMAZONAS N36-15", "city": "Quito", "phone": "022222222",
"govIdType": "RUC", "govIdNumber": "1791415132001",
"secondaryGovIdType": null, "secondaryGovIdNumber": null
},
"company": {
"legalName": "INT FOOD SERVICES CORP SA",
"tradeName": "KFC",
"govIdType": "RUC",
"govIdNumber": "1791415132001",
"headquartersAddress": "PICHINCHA / QUITO / INAQUITO / COREA 126 Y AV. AMAZONAS",
"countryLines": [],
"legends": []
},
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T22:03:11.412Z",
"configVersion": null,
"resolvedFrom": {}
},
"cancellation": {
"canCancel": false,
"outcome": "DENY",
"code": "CANCELLATION_POLICY_DENIED",
"reason": "Ventana de anulación superada",
"reasonDetail": "Esta cuenta solo permite anular dentro de los 30 minutos posteriores a la autorización del comprobante.",
"source": "account",
"threshold": {
"field": "minutesSinceAuthorization",
"threshold": 30,
"actual": 47
},
"resolvedAt": "2026-08-21T22:03:11.412Z",
"resolvedFrom": {
"orderStatus": "COMPLETED",
"fiscalStatus": "authorized",
"countryCode": "EC",
"isFinalConsumer": "false",
"minutesSinceAuthorization": "47"
}
}
},
"printing": { "printable": false, "mode": "NONE", "reason": "CANCELLATION_NOT_ALLOWED" },
"graphic": null,
"failure": null,
"timestamps": {
"requestedAt": "2026-08-21T22:03:11.412Z",
"respondedAt": "2026-08-21T22:03:11.412Z",
"providerLatencyMs": null
},
"correlationId": null,
"providerCode": null,
"providerIdentity": null,
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": "81670b02-4073-4e50-adca-e3c9917e7006",
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "PENDING",
"documentStatus": "PENDING",
"retryable": true,
"environment": "PRODUCTION",
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "REFUND",
"lostSaleReason": "FISCAL_NUMBERING_FAILED",
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": "fnv1a:d096701f",
"resolvedFrom": {
"retryable": "true",
"operation": "INVOICE",
"requestStatus": "PENDING",
"failureScope": "TECHNICAL",
"failureCode": "PROVIDER_UNREACHABLE",
"storeCode": "K004"
}
}
},
"printing": {
"printable": false,
"mode": "PROVISIONAL_RECEIPT",
"reason": "AWAITING_FISCAL_NUMBERING"
},
"failure": {
"code": "PROVIDER_UNREACHABLE",
"scope": "TECHNICAL",
"message": "No se pudo establecer comunicación con el proveedor fiscal."
},
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": null,
"providerLatencyMs": null
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": null, "version": null, "reference": null },
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": "c4f0a1e2-5d3b-4f77-9a10-6b2e8c4d1f03",
"orderCode": "EC-K000-42-1786579046934",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "FAILED_RETRYABLE",
"documentStatus": "PENDING",
"retryable": true,
"environment": "PRODUCTION",
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": "FISCAL_NUMBERING_FAILED",
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": {
"retryable": "true",
"operation": "INVOICE",
"requestStatus": "FAILED_RETRYABLE",
"failureScope": "TECHNICAL",
"failureCode": "PROVIDER_UNAVAILABLE",
"storeCode": "K000"
}
}
},
"printing": {
"printable": false,
"mode": "PROVISIONAL_RECEIPT",
"reason": "AWAITING_FISCAL_NUMBERING"
},
"failure": {
"code": "PROVIDER_UNAVAILABLE",
"scope": "TECHNICAL",
"message": "El servicio de fiscalización no está disponible."
},
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": "1d10c5b9-9f1b-4c62-a425-238110ce9cd6",
"orderCode": "EC-UIO-9-1786580272803",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "FAILED_FINAL",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "REFUND",
"lostSaleReason": "FISCAL_NUMBERING_FAILED",
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": "fnv1a:d096701f",
"resolvedFrom": {
"retryable": "false",
"operation": "INVOICE",
"requestStatus": "FAILED_FINAL",
"failureScope": "FUNCTIONAL",
"failureCode": "FISCAL_BUSINESS_RULE",
"storeCode": "UIO"
}
}
},
"printing": {
"printable": false,
"mode": "PROVISIONAL_RECEIPT",
"reason": "FISCAL_REJECTED"
},
"failure": {
"code": "FISCAL_BUSINESS_RULE",
"scope": "FUNCTIONAL",
"message": "identidad fiscal de tienda no configurada: EC / tienda EC-UIO-001"
},
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": null,
"orderCode": "EC-K000-42-1786579046934",
"idempotencyKey": null,
"reused": false,
"countryCode": "EC",
"requestStatus": "NOT_APPLICABLE",
"documentStatus": null,
"retryable": false,
"environment": null,
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "NOT_APPLICABLE" }
}
},
"printing": { "printable": false, "mode": "NONE", "reason": "NUMBERING_DISABLED" },
"failure": null,
"store": {
"code": "K000",
"name": "Laboratorio Ecuador",
"govIdType": "RUC",
"govIdNumber": "1791415132001"
},
"company": {
"legalName": "INT FOOD SERVICES CORP S.A.",
"tradeName": "KFC",
"countryLines": [],
"legends": []
},
"timestamps": {
"requestedAt": "2026-08-14T01:01:14.7Z",
"respondedAt": "2026-08-14T01:01:14.7Z",
"providerLatencyMs": null
},
"correlationId": null,
"providerCode": null,
"providerIdentity": null,
"providerMetadata": null
}
}
{
"success": false,
"error": "CONFLICT",
"message": "La Idempotency-Key ya fue usada con un cuerpo distinto"
}
Solicitar numeración fiscal (v2)
Obtiene los identificadores fiscales que el punto de venta necesita para imprimir el comprobante. Es síncrono: se llama después de cobrar y antes de inyectar la orden.
{
"orderCode": "EC-K004-42-1786579046934",
"createdAt": "2026-08-12T17:26:09.386Z",
"operation": "INVOICE",
"store": { "code": "K004" },
"device": { "uid": "kiosk-01", "name": "KIOSK", "platform": "android" },
"totals": [
{
"currencyCode": "USD",
"total": 10,
"subtotalWithoutTaxes": 8.7,
"taxValue": 1.3,
"taxes": [
{ "name": "IVA", "base": 8.7, "rate": "0.15", "amount": 1.3 }
]
}
],
"client": {
"uid": "8Z35YvBbgKVj67AJwZ3nFmAqrtk1",
"name": "CONSUMIDOR",
"lastName": "FINAL",
"email": "consumidor.final@kfc.com.ec",
"phone": "2222222",
"govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000",
"externalId": "",
"additionalInfo": {
"fiscal": "",
"gender": "",
"birthdate": ""
},
"billingInformation": {
"email": "",
"phone": "2222222",
"address": "",
"govIdType": "FINAL_CONSUMER",
"externalId": "",
"govIdNumber": "00000000000",
"businessName": ""
}
},
"metadata": {}
}
{
"orderCode": "CO-K039-1786901234",
"createdAt": "2026-08-16T14:03:22.145Z",
"operation": "INVOICE",
"store": { "code": "K039" },
"device": { "uid": "52CAEA5A18D9B75F", "name": "CAJA 3", "platform": "android" },
"client": {
"name": "Consumidor",
"lastName": "final",
"govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000"
},
"totals": [
{
"currencyCode": "COP",
"total": 50000,
"subtotalWithoutTaxes": 42016.81,
"taxValue": 7983.19,
"taxes": [
{ "name": "IVA", "base": 42016.81, "rate": "0.19", "amount": 7983.19 }
]
}
],
"metadata": {}
}
{
"orderCode": "EC-K004-42-1786579046934",
"createdAt": "2026-08-12T19:10:00.000Z",
"operation": "CANCEL",
"store": { "code": "K004" },
"device": { "uid": "kiosk-01", "name": "KIOSK", "platform": "android" },
"client": {
"uid": "8Z35YvBbgKVj67AJwZ3nFmAqrtk1",
"name": "CONSUMIDOR",
"lastName": "FINAL",
"email": "consumidor.final@ejemplo.com",
"phone": "2222222",
"govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000",
"externalId": "",
"additionalInfo": { "fiscal": "", "gender": "", "birthdate": "" },
"billingInformation": {
"email": "", "phone": "2222222", "address": "",
"govIdType": "FINAL_CONSUMER", "externalId": "",
"govIdNumber": "00000000000", "businessName": ""
}
},
"totals": [
{
"currencyCode": "USD",
"total": 10,
"subtotalWithoutTaxes": 8.7,
"taxValue": 1.3,
"taxes": [
{ "name": "IVA", "base": 8.7, "rate": "0.15", "amount": 1.3 }
]
}
],
"metadata": {}
}
{
"success": true,
"data": {
"fiscalRequestId": "8d5b425c-87d2-4848-ab74-517a0ca2743e",
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": {
"documentType": "SALE_INVOICE",
"documentLabel": "FACTURA",
"documentNumber": "005-004-000000011",
"authorizationMode": "ONLINE",
"authorizationLabel": "EMISION NORMAL",
"issuedAt": "2026-08-12T23:57:47.118Z",
"compensates": null
},
"countryData": {
"numeroComprobante": "005-004-000000011",
"claveAcceso": "1208202601000000000000110050040000000111234567811",
"establecimiento": "005",
"puntoEmision": "004",
"secuencial": "000000011",
"ambiente": "PRODUCCION"
},
"store": {
"code": "K004", "name": "Sucursal Amazonas",
"address": "AV. AMAZONAS N36-15", "city": "Quito", "phone": "022222222",
"govIdType": "RUC", "govIdNumber": "1791415132001",
"secondaryGovIdType": null, "secondaryGovIdNumber": null
},
"company": {
"legalName": "INT FOOD SERVICES CORP SA",
"tradeName": "KFC",
"govIdType": "RUC",
"govIdNumber": "1791415132001",
"headquartersAddress": "PICHINCHA / QUITO / INAQUITO / COREA 126 Y AV. AMAZONAS",
"countryLines": [
{ "key": "granContribuyente", "label": "GRAN CONTRIBUYENTE", "value": "NAC-GCFOIOC21-00000900-E" },
{ "key": "contribuyenteEspecial", "label": "CONTRIBUYENTE ESPECIAL", "value": "155" },
{ "key": "obligadoContabilidad", "label": "Obligado a llevar contabilidad", "value": "SI" }
],
"legends": [
{ "key": "avisoCambios", "text": "Estimado cliente: Por favor verifique los datos de su factura…" }
]
},
"graphic": { "qr": "1208202601000000000000110050040000000111234567811" },
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "GENERATED" }
},
"cancellation": null
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"failure": null,
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": { "deviceUid": "4B8E21F9A0D35C7A", "externalStoreCode": "K000" }
}
}
{
"success": true,
"data": {
"fiscalRequestId": "c1a7f0e2-9b34-4d21-8e55-3f60ab12cd90",
"orderCode": "CO-K039-1786901234",
"idempotencyKey": "2f81dcb4-77a0-4c19-9e3b-5a04e7f1b2c8",
"reused": false,
"countryCode": "CO",
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": {
"documentType": "SALE_INVOICE",
"documentLabel": "FACTURA ELECTRONICA DE VENTA",
"documentNumber": "SETP990000001",
"authorizationMode": "ONLINE",
"authorizationLabel": "VALIDACION PREVIA",
"issuedAt": "2026-08-16T14:21:03.118Z",
"compensates": null
},
"countryData": {
"numeroComprobante": "SETP990000001",
"cufe": "9c4f1e… (96 caracteres hexadecimales)",
"prefijo": "SETP",
"numeroDian": "990000001",
"qrCode": "https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey=9c4f1e…",
"ambiente": "PRODUCCION"
},
"store": {
"code": "K039", "name": "Sucursal Chapinero",
"address": "CRA 13 # 63-39", "city": "Bogotá", "phone": "6013334444",
"govIdType": "NIT", "govIdNumber": "9001234567",
"secondaryGovIdType": null, "secondaryGovIdNumber": null
},
"company": {
"legalName": "COMERCIALIZADORA ANDINA S.A.S.",
"tradeName": "KFC",
"govIdType": "NIT",
"govIdNumber": "9001234567",
"headquartersAddress": "BOGOTA D.C. / CHAPINERO / CRA 13 # 63-39",
"countryLines": [
{ "key": "regimen", "label": "REGIMEN", "value": "RESPONSABLE DE IVA" },
{ "key": "resolucion", "label": "RESOLUCION DIAN", "value": "18760000001" }
],
"legends": []
},
"graphic": null,
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "GENERATED" }
},
"cancellation": null
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"failure": null,
"timestamps": {
"requestedAt": "2026-08-16T14:21:02.6Z",
"respondedAt": "2026-08-16T14:21:03.3Z",
"providerLatencyMs": 712
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": { "externalStoreCode": "K039" }
}
}
{
"success": true,
"data": {
"fiscalRequestId": "b73b2fd9-c7a6-42bd-815f-d39c210983ef",
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": "1e07b0e1-784b-40b9-8903-0326361ebefd",
"reused": false,
"countryCode": "EC",
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": {
"documentType": "CREDIT_NOTE",
"documentLabel": "NOTA DE CREDITO RIDE",
"documentNumber": "005-004-000000002",
"authorizationMode": "ONLINE",
"authorizationLabel": "EMISION NORMAL",
"issuedAt": "2026-08-14T18:32:32.242Z",
"compensates": {
"documentNumber": "005-004-000000068",
"issuedAt": "2026-08-14T18:31:57.649Z",
"reason": "ORDER_CANCELLATION",
"reasonLabel": "Anulación de pedido"
}
},
"countryData": {
"numeroComprobante": "005-004-000000002",
"claveAcceso": "1408202604179141513200110050040000000021234567815",
"establecimiento": "005",
"puntoEmision": "004",
"secuencial": "000000002",
"ambiente": "PRODUCCION"
},
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "GENERATED" }
},
"cancellation": {
"canCancel": true,
"outcome": "ALLOW",
"code": null,
"reason": null,
"reasonDetail": null,
"source": "default",
"threshold": null,
"resolvedAt": "2026-08-21T21:59:56.100Z",
"resolvedFrom": {
"orderStatus": "COMPLETED",
"fiscalStatus": "authorized",
"countryCode": "EC",
"isFinalConsumer": "false",
"minutesSinceAuthorization": "4"
}
}
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"graphic": { "qr": "1408202604179141513200110050040000000021234567815" },
"failure": null,
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": { "deviceUid": "4B8E21F9A0D35C7A", "externalStoreCode": "K000" }
}
}
{
"success": true,
"data": {
"fiscalRequestId": null,
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": null,
"reused": false,
"countryCode": "EC",
"requestStatus": "BLOCKED_BY_POLICY",
"documentStatus": null,
"retryable": false,
"environment": null,
"document": null,
"countryData": null,
"store": {
"code": "K004", "name": "Sucursal Amazonas",
"address": "AV. AMAZONAS N36-15", "city": "Quito", "phone": "022222222",
"govIdType": "RUC", "govIdNumber": "1791415132001",
"secondaryGovIdType": null, "secondaryGovIdNumber": null
},
"company": {
"legalName": "INT FOOD SERVICES CORP SA",
"tradeName": "KFC",
"govIdType": "RUC",
"govIdNumber": "1791415132001",
"headquartersAddress": "PICHINCHA / QUITO / INAQUITO / COREA 126 Y AV. AMAZONAS",
"countryLines": [],
"legends": []
},
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T22:03:11.412Z",
"configVersion": null,
"resolvedFrom": {}
},
"cancellation": {
"canCancel": false,
"outcome": "DENY",
"code": "CANCELLATION_POLICY_DENIED",
"reason": "Ventana de anulación superada",
"reasonDetail": "Esta cuenta solo permite anular dentro de los 30 minutos posteriores a la autorización del comprobante.",
"source": "account",
"threshold": {
"field": "minutesSinceAuthorization",
"threshold": 30,
"actual": 47
},
"resolvedAt": "2026-08-21T22:03:11.412Z",
"resolvedFrom": {
"orderStatus": "COMPLETED",
"fiscalStatus": "authorized",
"countryCode": "EC",
"isFinalConsumer": "false",
"minutesSinceAuthorization": "47"
}
}
},
"printing": { "printable": false, "mode": "NONE", "reason": "CANCELLATION_NOT_ALLOWED" },
"graphic": null,
"failure": null,
"timestamps": {
"requestedAt": "2026-08-21T22:03:11.412Z",
"respondedAt": "2026-08-21T22:03:11.412Z",
"providerLatencyMs": null
},
"correlationId": null,
"providerCode": null,
"providerIdentity": null,
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": "81670b02-4073-4e50-adca-e3c9917e7006",
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "PENDING",
"documentStatus": "PENDING",
"retryable": true,
"environment": "PRODUCTION",
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "REFUND",
"lostSaleReason": "FISCAL_NUMBERING_FAILED",
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": "fnv1a:d096701f",
"resolvedFrom": {
"retryable": "true",
"operation": "INVOICE",
"requestStatus": "PENDING",
"failureScope": "TECHNICAL",
"failureCode": "PROVIDER_UNREACHABLE",
"storeCode": "K004"
}
}
},
"printing": {
"printable": false,
"mode": "PROVISIONAL_RECEIPT",
"reason": "AWAITING_FISCAL_NUMBERING"
},
"failure": {
"code": "PROVIDER_UNREACHABLE",
"scope": "TECHNICAL",
"message": "No se pudo establecer comunicación con el proveedor fiscal."
},
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": null,
"providerLatencyMs": null
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": null, "version": null, "reference": null },
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": "c4f0a1e2-5d3b-4f77-9a10-6b2e8c4d1f03",
"orderCode": "EC-K000-42-1786579046934",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "FAILED_RETRYABLE",
"documentStatus": "PENDING",
"retryable": true,
"environment": "PRODUCTION",
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": "FISCAL_NUMBERING_FAILED",
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": {
"retryable": "true",
"operation": "INVOICE",
"requestStatus": "FAILED_RETRYABLE",
"failureScope": "TECHNICAL",
"failureCode": "PROVIDER_UNAVAILABLE",
"storeCode": "K000"
}
}
},
"printing": {
"printable": false,
"mode": "PROVISIONAL_RECEIPT",
"reason": "AWAITING_FISCAL_NUMBERING"
},
"failure": {
"code": "PROVIDER_UNAVAILABLE",
"scope": "TECHNICAL",
"message": "El servicio de fiscalización no está disponible."
},
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": "1d10c5b9-9f1b-4c62-a425-238110ce9cd6",
"orderCode": "EC-UIO-9-1786580272803",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "FAILED_FINAL",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "REFUND",
"lostSaleReason": "FISCAL_NUMBERING_FAILED",
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": "fnv1a:d096701f",
"resolvedFrom": {
"retryable": "false",
"operation": "INVOICE",
"requestStatus": "FAILED_FINAL",
"failureScope": "FUNCTIONAL",
"failureCode": "FISCAL_BUSINESS_RULE",
"storeCode": "UIO"
}
}
},
"printing": {
"printable": false,
"mode": "PROVISIONAL_RECEIPT",
"reason": "FISCAL_REJECTED"
},
"failure": {
"code": "FISCAL_BUSINESS_RULE",
"scope": "FUNCTIONAL",
"message": "identidad fiscal de tienda no configurada: EC / tienda EC-UIO-001"
},
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": null,
"orderCode": "EC-K000-42-1786579046934",
"idempotencyKey": null,
"reused": false,
"countryCode": "EC",
"requestStatus": "NOT_APPLICABLE",
"documentStatus": null,
"retryable": false,
"environment": null,
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "NOT_APPLICABLE" }
}
},
"printing": { "printable": false, "mode": "NONE", "reason": "NUMBERING_DISABLED" },
"failure": null,
"store": {
"code": "K000",
"name": "Laboratorio Ecuador",
"govIdType": "RUC",
"govIdNumber": "1791415132001"
},
"company": {
"legalName": "INT FOOD SERVICES CORP S.A.",
"tradeName": "KFC",
"countryLines": [],
"legends": []
},
"timestamps": {
"requestedAt": "2026-08-14T01:01:14.7Z",
"respondedAt": "2026-08-14T01:01:14.7Z",
"providerLatencyMs": null
},
"correlationId": null,
"providerCode": null,
"providerIdentity": null,
"providerMetadata": null
}
}
{
"success": false,
"error": "CONFLICT",
"message": "La Idempotency-Key ya fue usada con un cuerpo distinto"
}
- Acá no hay id de orden. Al cobrar, la orden todavía no existe en Fire. El
orderCodees lo único que liga esta solicitud con la venta, así que tiene que ser el mismo string que después viaja en la inyección. - La respuesta no dice que el documento esté autorizado. Dice que hay números para imprimir. La autorización del ente llega después, de forma asíncrona.
- Pedís una operación, no un tipo de documento.
INVOICEoCANCEL. Con qué instrumento fiscal se materializa —factura, nota de crédito, evento de cancelación— lo decide el país, y no es asunto del punto de venta.
CANCEL se consulta primero contra la política de
cancelación de la cuenta — si la política no lo permite, no se numera nada. INVOICE se
comporta idéntico a v1, hasta en los códigos HTTP.Migrar desde v1
Lo que tu canal tiene que manejar antes de cambiar la URL:- Un
CANCELpuede volver sindocument. Esa es toda la migración. ChequeárequestStatus === "BLOCKED_BY_POLICY"(o simplementedocument === nullconprinting.mode: "NONE", que ya manejás paraNOT_APPLICABLE). - Mostrale a la persona el porqué.
policy.cancellation.reasonen una línea,reasonDetailcomo párrafo. Ramificá porcode, nunca por el texto. - No reintentes.
retryable: false— la política va a contestar lo mismo.
INVOICE no requiere ningún cambio: misma solicitud, mismas respuestas, mismos códigos de
estado que v1.
El flujo completo
Cobrás
Pedís la numeración
Imprimís
printing.mode imprimís el comprobante fiscal o un ticket provisional.Inyectás la orden
orderCode.El ente autoriza
policy.numberingFailure.action — no con un error que te deje sin
saber qué hacer.Pero la decisión no siempre es seguir: la cuenta puede configurar que sin comprobante no
se vende. Ramificá por action, nunca por el código HTTP:CONTINUE(el default) — imprimís segúnprinting.modee inyectás la orden igual. Si quedó sin numerar, volvé a llamar con el mismoorderCode: nadie la completa sola, y un202que nadie reintenta se queda así para siempre.REFUND— devolvés el cobro y no inyectás la orden. No hay nada que completar después: reintentar la numeración de una venta que devolviste generaría un comprobante para algo que no ocurrió.
CONTINUE: dos. Mientras retryable venga en
true, volvé a llamar con el mismo orderCode hasta dos veces más. Si al segundo reintento
sigue sin numerar, tratalo como definitivo: la venta ya está inyectada con ticket provisional
y lo que falta se resuelve por soporte, no en el mostrador.Con REFUND no hay reintento: cero. La venta se devolvió, y numerarla después generaría un
comprobante de algo que no ocurrió.El tope lo aplicás vos. Fire numera cada intento y lo guarda para soporte, pero no corta
por su cuenta: si llamás una cuarta vez, le vuelve a preguntar al proveedor igual. Y la
respuesta no va a cambiar por insistir — action no depende de retryable, así que lo que
diga el tercer intento ya lo decía el primero.Headers
accountId ni vendorId: una credencial no puede mentir sobre a quién pertenece.orderCode, que es la
llave natural en los dos extremos: si repetís el mismo orderCode, recibís el mismo
documento aunque generes una llave nueva.Lo que esta llave aporta es detectar que la reusaste para otra venta: si llega la
misma llave con un cuerpo distinto, Fire responde 409 en vez de numerar. Es un guard
contra un bug del punto de venta —no regenerar la llave— que sin esto pasaría inadvertido.correlationId. No cambia nada del
comportamiento: sirve para que, cuando algo falle, puedas cruzar tu registro con el nuestro
sin tener que emparejar por hora y orderCode.Si no lo mandás, correlationId viene en null.Cuerpo
Es un payload propio, no el de la inyección de órdenes: solo lo que hace falta para numerar. Los nombres coinciden con los que ya usás (store, device, orderCode) para que
lo armes recortando lo que ya tenés, pero no envíes el cuerpo completo de la orden — nada de
products, payments ni shippingMethod.
Siete campos, y ninguno es un código del ente.
orderCode, Fire corta con 409
antes de emitir: sin ese corte, la segunda tienda imprimiría el secuencial de la primera.2026-08-12 17:26:09), se interpreta como UTC. Al proveedor
sale siempre normalizada, con Z.INVOICE— numerar la venta.CANCEL— anular.
orderCode de la venta, con operation: "CANCEL". Nada
más: ni claves fiscales, ni el número del documento original, ni identificadores de Fire.Fire encuentra el documento a compensar por la llave natural
—país + orderCode + operación— y te devuelve a cuál corresponde en
document.compensates. Tu punto de venta no necesita guardar nada nuestro para poder
anular.code, Fire resuelve el país, la identidad fiscal del emisor y el
establecimiento — no los envíes vos.Mostrar store
Mostrar store
K004).Mostrar device
Mostrar device
KIOSK, CAJA 3).android, ios, web… Informativo.ip, y lo que necesites). Opaco: Fire no lo interpreta.Viaja porque cuando una caja emite mal, saber de qué máquina salió es la diferencia
entre arreglarlo y adivinar.externalId con el que el canal lo
informaba; se quitó. Lo asigna el ente bajo el RUC del emisor y el punto de venta no habla
ese idioma: ahora lo resuelve el proveedor a partir del uid, igual que hace con
store.code.Viene de vuelta en countryData.puntoEmision, con el que quedó efectivamente emitido.payments.totals que ya mandás en la inyección de órdenes
— mandalo tal cual, entero.Mostrar totals[] — lo que Fire usa para fiscalizar
Mostrar totals[] — lo que Fire usa para fiscalizar
USD en Ecuador, COP en Colombia, BRL en Brasil.name, base, rate y amount. Siempre el array
granular: hay regímenes que los declaran por separado y no aceptan el total sumado.El nombre es el tuyo (IVA, ICMS, PIS…): traducirlo al código del ente es trabajo
del proveedor fiscal, no tuyo.| País | Moneda | Impuestos |
|---|---|---|
| Ecuador | USD | IVA 15% |
| Colombia | COP | IVA 19% |
| Brasil | BRL | seis: ICMS, PIS, COFINS, IBS_UF, IBS_MUN, CBS |
taxes[] con amount, no un porcentaje suelto. Un elemento por impuesto, con
name, base, rate y amount — la misma forma en todos los países.El monto tiene que venir calculado por vos, que sos quien lo cobró e imprimió. Donde el
identificador fiscal es un hash de la factura —el CUFE colombiano— derivarlo del porcentaje
obliga a alguien más a redondear, y si redondea distinto que la caja, el identificador deja
de corresponder al papel que tiene el cliente.50000, 42016.81.
No lo multipliques por 10.000.Esa escala existe, pero es de otro camino: los eventos de la orden
(order.completed y los demás) llevan los mismos importes como
entero en string ×10.000, porque es como FIRE los almacena. Acá no.Si integrás los dos caminos, esa es la única conversión que tenés que hacer — y hacerla al
revés significa declarar diez mil veces el monto.Mostrar client — lo que Fire usa para fiscalizar
Mostrar client — lo que Fire usa para fiscalizar
FINAL_CONSUMER · CI · RUC ·
CC · NIT.billingInformation.businessName.govIdType/govIdNumber, tienen prioridad sobre
los de la raíz: es el documento que el cliente pidió para su factura.uid, email, phone, gender, birthdate, externalId— viajan
y no se fiscalizan. Fire no los reenvía al proveedor fiscal: no son asunto del ente.govIdType:| Valor | Qué es | Dónde |
|---|---|---|
FINAL_CONSUMER | venta sin comprador identificado — govIdNumber en ceros | todos |
CI | cédula de identidad | Ecuador |
RUC | Registro Único de Contribuyentes | Ecuador |
CC | cédula de ciudadanía | Colombia |
NIT | Número de Identificación Tributaria | Colombia |
CEDULA donde va CI, o dos escrituras distintas para el
consumidor final, son documentos que salen mal sin que nada falle en el camino."govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000"
222222222222 de la DIAN en
Colombia, la ausencia de destinatario en Brasil. Eso lo resuelve el proveedor fiscal, que es
quien está certificado ante el ente.Es deliberado: esa regla cambia por país y por resolución del ente, y no debería obligarte a
desplegar el punto de venta cuando cambie.Fire tampoco lo toca. El bloque client viaja tal cual al proveedor: no completamos el
número, no lo normalizamos y no lo validamos. Lo que mandás es lo que él recibe.400 — es preferible
un error de Fire a un campo inventado viajando al ente.En la mayoría de los casos va vacío: lo que es constante de la tienda no se manda acá,
se configura una vez (ver abajo).Lo que NO se manda: la configuración de la tienda
Todo lo que es constante de la tienda se configura una sola vez en el backoffice y viaja solo: la identidad fiscal del emisor, y un bloque llave-valor por país para los atributos que el proveedor de ese país necesite.CANCEL, y solo cuando la resolución automática no alcanza: una anulación que
referencia un documento de otra orden, o varias facturas para la misma.En el caso normal no lo envíes. Fire encuentra el original por la clave natural, así
que tu punto de venta no necesita guardar ningún identificador nuestro para poder anular.Respuesta
x-correlation-id, o null si no lo mandaste. Es para trazabilidad: no
interviene en la numeración ni en la idempotencia.true si esta solicitud ya existía y se devolvió tal cual, sin numerar de nuevo.| Valor | Qué pasó | HTTP |
|---|---|---|
GENERATED | Hay números. Imprimí el comprobante fiscal | 201 |
PENDING | No se sabe. El proveedor no contestó — pudo haber numerado | 202 |
FAILED_RETRYABLE | El proveedor dijo “no ahora”. Podés reintentar (hasta 2 veces) | 202 |
FAILED_FINAL | El proveedor dijo “no” definitivo. Reintentar no sirve | 200 |
NOT_APPLICABLE | Esta tienda no tiene numeración fiscal. No es un error | 200 |
BLOCKED_BY_POLICY | La política de cancelación no permite esta anulación. No se numeró nada | 200 |
PENDING no significa “no hay comprobante”: significa “no sabemos”. Se cortó la
comunicación y el proveedor pudo haber numerado, consumido un secuencial y emitido el
documento sin que nos enteremos.Reintentá con el mismo orderCode. Fire retoma la solicitud y vuelve a preguntarle
al proveedor; si la primera vez numeró, recibís ese mismo documento en vez de uno nuevo.
Numerar de nuevo con otro orderCode sería declarar la misma venta dos veces ante el ente.NOT_APPLICABLE y BLOCKED_BY_POLICY no se guardan: ninguno crea solicitud fiscal
(fiscalRequestId: null) ni aparece en los eventos de la orden. El primero existe porque
el POS llama siempre a este endpoint —es como descubre si la tienda numera— y contestarle
un error haría que cada venta de una tienda sin gateway pareciera una falla. El segundo,
porque no se numeró nada: no hay documento que conciliar contra el ente, y una solicitud
guardada sin documento ensuciaría justo la tabla de la que sale la conciliación.PENDING · AUTHORIZED · REJECTED · CANCELLEDPENDING: hay números, no hay veredicto. Solo lo mueve
el resultado del proveedor, que llega después. Colapsar los dos estados en uno es el
error que hace que un POS crea que una venta está autorizada cuando solo está numerada.SANDBOX o PRODUCTION.Es nuestro, no del ente. Sale de la configuración fiscal de la cuenta —que es por vendor y
por país, así que la misma cuenta puede tener Ecuador en producción y Colombia en
sandbox— y queda congelado en la solicitud: si mañana se cambia la configuración, este
valor sigue diciendo con qué numeró esta venta.countryData con el
vocabulario del país (ambiente: "PRUEBAS" | "PRODUCCION" en Ecuador). Son dos hechos
distintos: uno dice contra qué configuración emitió Fire, el otro qué declaró el
organismo. Normalmente coinciden — y cuando no, eso es exactamente lo que hay que poder
ver, por eso no se deduce uno del otro.null cuando requestStatus es NOT_APPLICABLE: no se numeró, así que no hubo ambiente
en el que numerar.null si no se numeró.Mostrar document
Mostrar document
SALE_INVOICE o CREDIT_NOTE. Vocabulario de Fire: dice qué operación es, no con qué
instrumento la materializa el país.FACTURA, NOTA DE CREDITO. Lo traduce Fire —
el instrumento fiscal lo define el régimen, y no queremos que cada canal lleve su mapa.001-020-000000123). Es para imprimir: para buscar o conciliar usá los
identificadores de countryData.En Ecuador es el eco de countryData.numeroComprobante. Fire no lo recompone ni le
cambia el formato — la regla es del régimen, no nuestra.ONLINE · OFFLINE · BATCH. Vocabulario de Fire.EMISION NORMAL, EMISION POR CONTINGENCIA. Misma razón que
documentLabel.null en una factura.{
"documentNumber": "005-004-000000068",
"issuedAt": "2026-08-14T18:31:57.649Z",
"reason": "ORDER_CANCELLATION",
"reasonLabel": "Anulación de pedido"
}
Mostrar compensates
Mostrar compensates
N. FACTURA MODIFICADA.FECHA EMISION FAC. — es distinta de
la fecha de la nota de crédito, que está un nivel arriba.ORDER_CANCELLATION: la
anulación del pedido completo.countryData.sequential y serie ya no están acá. Son piezas con forma de país —en Ecuador la
serie son seis dígitos que se parten al medio— y viven en countryData con el nombre que
les da su ente. En document quedó solo lo que significa lo mismo en todos lados.{
"numeroComprobante": "001-020-000000123",
"claveAcceso": "1208202601179141513200110010200000001231234567813",
"establecimiento": "001",
"puntoEmision": "020",
"secuencial": "000000123",
"ambiente": "PRODUCCION"
}
{
"numeroComprobante": "SETP990000001",
"cufe": "9c4f1e… (96)",
"prefijo": "SETP",
"numeroDian": "990000001",
"qrCode": "https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey=9c4f1e…",
"ambiente": "PRODUCCION"
}
documentLabel es FACTURA ELECTRONICA DE VENTA y authorizationLabel es
VALIDACION PREVIA — son los nombres de la DIAN, no una variante del texto ecuatoriano.ambiente llega traducido en los dos países, y ahí está lo importante: la DIAN codifica
1 como producción y el SRI como pruebas. Fire lo resuelve para que ningún canal tenga
que llevar esa tabla.ambiente: "2" —así lo define el SRI— y acá llega "PRODUCCION", que es lo que dice el
ticket. Traducirlo del lado del canal significaría que cada integrador lleva su copia de
la tabla del ente, y el primero que la copie mal imprime “PRUEBAS” en una factura de
producción.claveAcceso,
Colombia cufe, Brasil chaveAcesso. Un canal que lea
countryData.claveAcceso a secas funciona en Ecuador y se rompe en el segundo país.countryData por país
Hoy el gateway numera en Ecuador y Colombia. Cada país que entra suma su pestaña acá — y solo eso: la
forma de la respuesta no cambia, porque el bloque es abierto.
- Ecuador (EC) · disponible
- Colombia (CO) · disponible
- Otros países · cuando entren
| Clave | Tipo | Siempre | Notas |
|---|---|---|---|
numeroComprobante | string | ✓ | El número visible, ya armado: estab-ptoEmi-secuencial |
claveAcceso | string | ✓ | 49 dígitos. Es también lo que se codifica en el QR |
establecimiento | string | ✓ | 3 dígitos. Lo resuelve el proveedor desde store.code |
puntoEmision | string | ✓ | 3 dígitos. Lo resuelve el proveedor desde device.uid |
secuencial | string | ✓ | 9 dígitos. La factura y la nota de crédito llevan secuencias distintas |
ambiente | string | ✓ | PRUEBAS o PRODUCCION — ya traducido; el SRI lo define como "1" / "2" |
{
"numeroComprobante": "001-020-000000123",
"claveAcceso": "1208202601179141513200110010200000001231234567813",
"establecimiento": "001",
"puntoEmision": "020",
"secuencial": "000000123",
"ambiente": "PRODUCCION"
}
document.documentNumber es un eco de este mismo valor, para que no tengas que
entrar al bloque del país solo para imprimir. Es el mismo hecho, no dos.001-020-123 puede ser tan legal como
001-020-000000123. Componer el número vos mismo a partir de establecimiento,
puntoEmision y secuencial es adoptar una convención que no te corresponde: imprimí
numeroComprobante tal como llega.| Clave | Tipo | Siempre | Notas |
|---|---|---|---|
numeroComprobante | string | ✓ | El número visible, ya armado: prefijo + consecutivo |
cufe | string | ✓ | 96 caracteres hexadecimales (SHA-384). Es el identificador del documento ante la DIAN |
prefijo | string | ✓ | Prefijo del rango de numeración autorizado por resolución |
numeroDian | string | ✓ | El consecutivo solo, sin el prefijo |
qrCode | string | ✓ | URL del catálogo de la DIAN. Es lo que se imprime como QR |
ambiente | string | ✓ | PRUEBAS o PRODUCCION — ya traducido; la DIAN lo define como "1" / "2" |
{
"numeroComprobante": "SETP990000001",
"cufe": "9c4f1e… (96 caracteres hexadecimales)",
"prefijo": "SETP",
"numeroDian": "990000001",
"qrCode": "https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey=9c4f1e…",
"ambiente": "PRODUCCION"
}
ambiente llega traducido, y menos mal. La DIAN usa 1 para producción y 2 para
pruebas — al revés que el SRI. Fire lo resuelve acá para que ningún canal tenga que
llevar su propia copia de la tabla: el primero que la copie del lado equivocado imprime
“PRUEBAS” en una factura real.numeroComprobante y numeroDian no son lo mismo. El primero es el número visible
completo, tal como va impreso; el segundo es solo el consecutivo. Los dos llegan
resueltos por el proveedor — Fire no concatena nada, igual que en Ecuador.document.documentNumber es un eco de numeroComprobante, para imprimir sin entrar
al bloque del país.graphic en Colombia. El QR es la URL del catálogo de la DIAN y vive en
countryData.qrCode. Un canal que espere graphic.qr como en Ecuador no encuentra nada.countryData sigue siendo el mismo mapa abierto.Lo que sí cambia es el vocabulario, y por eso no conviene indexar claves fijas: Ecuador
habla de claveAcceso y Colombia de cufe, para el mismo hecho. Brasil dirá
chaveAcesso. Son ejemplos de cómo nombra cada régimen, no un contrato ya disponible.countryData.claveAcceso directo funciona en Ecuador y ya se rompe en Colombia.Mostrar store
Mostrar store
Mostrar company
Mostrar company
RUC, CNPJ…).[
{ "key": "granContribuyente", "label": "GRAN CONTRIBUYENTE", "value": "NAC-GCFOIOC21-00000900-E" },
{ "key": "contribuyenteEspecial", "label": "CONTRIBUYENTE ESPECIAL", "value": "155" },
{ "key": "obligadoContabilidad", "label": "Obligado a llevar contabilidad", "value": "SI" }
]
label porque el comprobante lo imprime literal. Si el rótulo lo pusiera cada
canal, dos cajas de la misma marca imprimirían distinto. Iterá la lista y dibujá: no
necesitás saber qué significa “gran contribuyente”, solo dónde ponerlo.[
{ "key": "avisoCambios", "text": "Estimado cliente: Por favor verifique los datos…" },
{ "key": "facturaElectronica", "text": "…con la Clave de Acceso: 1408…7811" }
]
key es estable y la elige quien los carga: si preferís tus propios textos, indexá
por ella e ignorá el nuestro.Una leyenda que interpola un dato que falta no viaja: media leyenda con un
marcador crudo impreso es peor que no imprimirla.countryLines ni legends. Son atributos del
comprobante, no de la empresa: el ente los exige en la factura. Cuando la numeración
no produce documento —PENDING, FAILED_RETRYABLE, FAILED_FINAL— los dos llegan
como [].La identidad sí llega completa (legalName, tradeName, govIdType,
govIdNumber, headquartersAddress): el ticket provisional necesita encabezado con
quién vendió.Sin esta regla, un provisional imprimía “verifique los datos de su factura, únicamente
se aceptarán cambios el mismo día de emisión” sobre un papel que no es una factura,
y declaraba un “GRAN CONTRIBUYENTE” en un documento que no declara nada.store, company y document.compensates vienen en toda respuesta de este endpoint,
incluida la del reintento idempotente, la de NOT_APPLICABLE y la del 400 de tienda que
no puede emitir — el canal necesita el encabezado tanto la primera vez como cuando repite
por un corte de red, y sobre todo cuando tiene que imprimir un provisional.Las consultas (GET por fiscalRequestId u orderCode) los devuelven en null: se
resuelven al emitir y no se guardan con la solicitud. Si tu integración los necesita para
reimprimir, usá los datos de impresión.{ "qr": "1208202601…811" }.Es un mapa abierto porque el comprobante de cada país no lleva siempre lo mismo, y un país
puede necesitar más de un elemento. Recorré las claves que vengan, no busques campos
fijos.Fire no genera imágenes: el tamaño y la resolución dependen de tu impresora, y eso solo lo
sabe quien imprime.Mostrar printing
Mostrar printing
| valor | qué imprimís | cuándo |
|---|---|---|
FISCAL_DOCUMENT | El comprobante fiscal, con sus números | Hay numeración (GENERATED) y el país deja entregarlo |
PROVISIONAL_RECEIPT | Un ticket no fiscal | No hay numeración todavía, o el ente rechazó |
NONE | Nada | Esta tienda no tiene representación fiscal (NOT_APPLICABLE) |
null cuando mode es
FISCAL_DOCUMENT — no hace falta justificar el caso normal.| valor | qué pasó |
|---|---|
ISSUED_OFFLINE | El país permite emitir sin conexión y regularizar después |
AWAITING_FISCAL_NUMBERING | Todavía no hay números: se pidieron y no llegaron |
FISCAL_REJECTED | El ente o el proveedor dijeron que no |
NUMBERING_DISABLED | Este vendor no numera — no es un error |
printing.Viaja siempre, también cuando la numeración salió bien. Ramificá por valor, nunca por
presencia de la clave.printing, y es una regla legal del país, no una preferencia
de nadie—. No bloquea ventas: cuando pedís la numeración el cliente ya pagó, así que no
hay venta que bloquear. Y no depende de retryable: un fallo que se arregla solo sigue
siendo un fallo, y si la cuenta configuró devolver, se devuelve.La configura la cuenta, por país y por vendor, en el backoffice. Vos no la deducís ni la
negociás: Fire te la devuelve resuelta, igual que printing. Si no está configurada, si trae
un valor que no reconocemos, o si no la pudimos leer, se aplica CONTINUE — el default
apunta para ese lado a propósito, porque una configuración mal escrita no puede disparar
devoluciones de dinero.Dos casos la ignoran por completo, sin importar cómo esté configurada: cuando no hubo
fallo (GENERATED o NOT_APPLICABLE), y cuando lo que falló era una anulación
(operation: "CANCEL") — ahí la orden existe y su dinero no se devolvió, así que no hay nada
que devolver.Los otros dos campos son el recibo de la decisión: configVersion dice con qué
configuración se decidió y resolvedFrom con qué contexto. Sirven para reconstruir una
devolución de hace tres semanas aunque hoy la cuenta esté configurada distinto.Mostrar policy.numberingFailure
Mostrar policy.numberingFailure
| valor | qué hacés | qué NO hacés |
|---|---|---|
CONTINUE | Imprimís según printing.mode e inyectás la orden | No devolvés plata |
REFUND | Devolvés el cobro y reportás la venta perdida | No inyectás la orden |
CONTINUE es el default: es lo que sale sin configurar, con la configuración rota, y en
todo caso donde no hubo fallo.CONTINUE → seguí como siempre: imprimí según printing.mode e inyectá la orden.REFUND → devolvé el cobro en el mostrador y no inyectes la orden. Después reportala
con Registrar venta perdida.No existe un valor para “bloqueá la venta”: cuando pedís la numeración el cliente ya
pagó. No hay venta que bloquear — lo único que se puede decidir es si le devolvés la
plata.reason reportar esa venta. Copialo tal cual — así no tenés que conocer nuestro
catálogo, y el día que agreguemos una causa no tocás código.Es un enum cerrado, y hoy tiene un solo valor:| valor | qué pasó |
|---|---|
FISCAL_NUMBERING_FAILED | La venta se cobró y no se pudo numerar |
reason de
Registrar venta perdida: lo pasás sin transformarlo. No hay
endpoint para consultar el catálogo, y a propósito — mientras sea un enum de este tamaño,
pedirte una llamada de más para descubrir un valor que ya te estamos mandando en esta
respuesta sería trabajo sin beneficio. Si algún día crece lo suficiente como para que
valga la pena, el catálogo pasa a ser un endpoint y este campo no cambia.Por eso mismo: ramificá por el valor sólo si tenés que hacer algo distinto según la
causa. Para reportar, copiá. Un canal que hoy hardcodea FISCAL_NUMBERING_FAILED en vez
de leerlo de acá funciona igual —hay un solo valor— y se rompe en silencio el día que
haya dos.null cuando esa venta no puede terminar sin orden: la numeración salió bien, o lo
que falló era una anulación —ahí la orden existe y su dinero no se devolvió—.fnv1a:d096701f. Sirve para lo
mismo que el hash de un deploy: agarrás una devolución de hace tres semanas y sabés con
qué configuración se decidió, aunque hoy sea otra.null significa que la cuenta no configuró nada y se aplicó el default.requestStatus, operation, retryable, y —si hubo respuesta
del proveedor— failureCode y failureScope.Es un recibo forense, no la regla. Ninguno de estos campos decide nada: la decisión
sale de lo que configuró la cuenta. Están para poder reconstruir por qué se decidió eso
aunque después cambien la configuración.null.null significa «no se preguntó», no «no se pudo evaluar»: emitir no es anular, así que
en INVOICE no hay nada que consultar. La clave viaja siempre —mismo criterio que el resto
del bloque— para que tu canal ramifique por el contenido y nunca por presencia de clave.Mostrar policy.cancellation
Mostrar policy.cancellation
false es lo único que bloquea: la solicitud volvió con
BLOCKED_BY_POLICY y sin documento.ALLOW o DENY. Redundante con canCancel, explícito a propósito.ORDER_NOT_CANCELLABLE o CANCELLATION_POLICY_DENIED (el código que recibe toda
regla escrita por la cuenta cuando no trae uno propio). null cuando la anulación se
permite.code.reason porque no siempre hay
lugar para las dos en una pantalla.baseline (las reglas propias de Fire, que corren siempre primero),
account (una regla que configuró la cuenta) o default (ninguna regla objetó).field, threshold
(el límite) y actual (el valor que tenía esta orden). Sin esto recibirías «se pasó del
límite» sin poder decir de cuánto era ni por cuánto se pasó.CONTINUE — y ese default apunta a propósito para ese lado: una configuración mal
escrita no puede disparar devoluciones. Lo vas a ver como configVersion: null.operation: "CANCEL", la
respuesta trae CONTINUE sin importar la configuración: no hay cobro que devolver, porque la
venta ya había ocurrido y sigue vigente. Lo que falta es el documento de la anulación.PENDING sí obedece la configuración. Que el proveedor no haya contestado no es una
excepción: para la caja, no tener número es no tener comprobante. Lo distinguís de un rechazo sólo por
resolvedFrom.requestStatus. Un PENDING trae failureCode igual que los demás —un timeout
llega como PROVIDER_TIMEOUT / TECHNICAL—, así que no lo busques en la ausencia del código.Tiene una consecuencia que conviene tener presente: el proveedor pudo haber numerado igual
y no habernos podido avisar. Si ese documento aparece después, va a existir un comprobante de
una venta que devolviste, y hay que anularlo.Qué hacer cuando llega REFUND
Tres pasos, en este orden. El tercero es el que se olvida.
Devolvé el cobro en el mostrador
No inyectes la orden
Reportala con Registrar venta perdida
POST /orders/lost-sales, copiando policy.numberingFailure.lostSaleReason en reason.
Es el único paso que nos avisa a nosotros.orderId + vendor—,
así que si te quedaste sin red justo ahí, acumulá y reenviá.Cuando lo que falla es una anulación
Anular son dos llamadas, en este orden: primero pedís acá la numeración de la nota de crédito (operation: "CANCEL"), y recién después llamás a
Cancelar orden.
Si la numeración de la nota falla, este endpoint responde igual que siempre: nunca un
4xx. PENDING y FAILED_RETRYABLE vuelven 202; FAILED_FINAL vuelve 200. El cuerpo
trae el failure con el motivo y el fiscalRequestId para escalar.
Y policy.numberingFailure.action siempre viene CONTINUE, con lostSaleReason: null,
sin importar cómo esté configurada la cuenta. No es una excepción caprichosa: acá no hay cobro
que devolver. La venta ya ocurrió, está en orders y sigue vigente — lo que falta es el papel
de la anulación, no la plata.
409 FISCAL_CREDIT_NOTE_MISSING.Esa es la diferencia grande con una venta: en la venta el fallo te deja seguir con un ticket
provisional; en la anulación te deja frenado, con la orden todavía vigente.Qué hacer: si retryable viene en true, volvé a llamar acá con el mismo orderCode —Fire
retoma la solicitud—. Si es FAILED_FINAL, leé failure.scope y escalá con el
fiscalRequestId: no hay nada que la caja pueda hacer, y nadie lo reintenta por vos.FAILED_FINAL en la nota de crédito no se arregla esperando. Esa solicitud queda
guardada como definitiva, y volver a llamar con el mismo orderCode —aunque el proveedor
ya esté sano— te devuelve la misma respuesta sin volver a preguntarle. No es un reintento
que falla: es la respuesta archivada.La consecuencia es que esa orden no se puede cancelar más por este camino: sigue
vigente en Fire, con su factura, y Cancelar orden
responde 409 FISCAL_CREDIT_NOTE_MISSING para siempre. Escalar acá no es “avisá y
reintentá más tarde” — es avisá, porque esto ya no se destraba solo.null cuando sí lo hay.Mostrar failure
Mostrar failure
TECHNICAL → el problema es de comunicación o del servicio;
imprimís provisional y se resuelve después. FUNCTIONAL → hay un dato mal y reintentar
no lo arregla.requestStatus y no crecen; este catálogo sí."clave de API inválida". Sólo si no manda ninguno usamos un texto propio según el
code. Es un texto para leer, no para ramificar: viene del proveedor y puede
cambiar sin aviso. Para decidir, usá code y scope.code | Qué pasó | scope |
|---|---|---|
FISCAL_BUSINESS_RULE | El ente o el proveedor rechazaron por una regla de negocio. El message trae el motivo real | FUNCTIONAL |
FISCAL_COUNTRY_NOT_SUPPORTED | El proveedor no atiende el país de esa tienda | TECHNICAL |
PROVIDER_AUTH_FAILED | Credencial del proveedor equivocada o revocada. Es configuración, no un fallo de numeración | TECHNICAL |
PROVIDER_TIMEOUT | No contestó dentro del presupuesto de tiempo | TECHNICAL |
PROVIDER_UNAVAILABLE | Contestó que no puede ahora | TECHNICAL |
PROVIDER_UNREACHABLE | No se pudo establecer comunicación | TECHNICAL |
PROVIDER_CONTRACT_VIOLATION | Contestó 2xx con algo que no cumple el contrato | TECHNICAL |
PROVIDER_TIMEOUT y PROVIDER_CONTRACT_VIOLATION llegan con requestStatus: "PENDING",
no con un fallo definitivo. En los dos casos el proveedor pudo haber numerado sin que
podamos leerlo: emitir otro comprobante por afuera declararía la misma venta dos veces ante
el ente.hio), no el nombre del proveedor. Es lo que dice
con qué integración se numeró esta venta. null en NOT_APPLICABLE: no intervino ninguno.null cuando no se numeró.Mostrar providerIdentity
Mostrar providerIdentity
Idempotency-Key — esa
la mandaste vos y vuelve en idempotencyKey.null cuando el proveedor no mandó nada.providerCode, providerIdentity, providerMetadata—
se leen igual acá y en fiscalRepresentation: lo que aprendés en un extremo sirve en el otro.Códigos de estado
200 puede ser un reintento
idempotente que numeró perfecto, o un rechazo definitivo del ente. Ramificá por
printing.mode y requestStatus, nunca por el código solo.| Código | Cuándo | requestStatus |
|---|---|---|
201 | Numerado ahora | GENERATED |
200 | Reintento idempotente — ya existía (reused: true) | cualquiera |
200 | Esta tienda no numera. No es un error | NOT_APPLICABLE |
200 | Rechazo definitivo. Es la respuesta a tu pregunta, no una falla de la llamada | FAILED_FINAL |
200 | La política de cancelación no permite esta anulación. No se numeró nada | BLOCKED_BY_POLICY |
202 | No hay números todavía. Imprimí provisional e inyectá igual | PENDING · FAILED_RETRYABLE |
400 | Cuerpo inválido o tienda sin configurar para emitir | — |
401 · 403 | Credenciales o permiso | — |
404 | La tienda no existe para el vendor de tu API key | — |
409 | Misma Idempotency-Key con otro cuerpo, o el orderCode ya lo usó otra tienda | — |
202
en vez de dejar la venta colgada.Ese 202 no es una promesa de que después llega por otro canal a tu POS: es Fire
diciendo “no tengo números todavía, imprimí provisional y seguí”.Para completarla, reintentá con el mismo orderCode. Fire retoma la solicitud y vuelve
a preguntarle al proveedor. Es raro, pero existe porque la alternativa —fallar la venta— es
peor.Qué hacer con cada respuesta
CONTINUE, que es el default y el de la mayoría de las
cuentas. Si policy.numberingFailure.action dice REFUND, la instrucción se invierte: no
inyectás la orden y no reintentás la numeración — devolvés el cobro y
reportás la venta perdida.Lo demás de cada estado —qué significa y si el fallo se arregla solo— vale en los dos casos.GENERATED — hay comprobante
GENERATED — hay comprobante
printing.mode: "FISCAL_DOCUMENT". Imprimí el comprobante con document.documentNumber
y dibujá los códigos de graphic. Inyectá la orden con el mismo orderCode.Si printing.reason es ISSUED_OFFLINE, el comprobante es válido pero se emitió en
contingencia: imprimí la leyenda que corresponda en ese país.{
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"reused": false,
"document": {
"documentType": "SALE_INVOICE",
"documentLabel": "FACTURA",
"documentNumber": "005-004-000000058",
"authorizationMode": "ONLINE",
"authorizationLabel": "EMISION NORMAL",
"issuedAt": "2026-08-14T01:01:14.722Z"
},
"countryData": {
"numeroComprobante": "005-004-000000058",
"claveAcceso": "1308202601000000000000210050040000000581234567811",
"establecimiento": "005",
"puntoEmision": "004",
"secuencial": "000000058",
"ambiente": "PRODUCCION"
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"graphic": { "qr": "1308202601000000000000210050040000000581234567811" },
"failure": null
}
{
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"reused": false,
"document": {
"documentType": "SALE_INVOICE",
"documentLabel": "FACTURA ELECTRONICA DE VENTA",
"documentNumber": "SETP990000001",
"authorizationMode": "ONLINE",
"authorizationLabel": "VALIDACION PREVIA",
"issuedAt": "2026-08-16T14:21:03.118Z"
},
"countryData": {
"numeroComprobante": "SETP990000001",
"cufe": "9c4f1e… (96 hex)",
"prefijo": "SETP",
"numeroDian": "990000001",
"qrCode": "https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey=9c4f1e…",
"ambiente": "PRODUCCION"
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"graphic": null,
"failure": null
}
PENDING — no se sabe si hay comprobante
PENDING — no se sabe si hay comprobante
orderCode: Fire retoma la solicitud y vuelve a preguntarle al proveedor, así que si la
primera vez numeró, recuperás ese documento.{
"requestStatus": "PENDING",
"document": null,
"printing": { "printable": false, "mode": "PROVISIONAL_RECEIPT", "reason": "AWAITING_FISCAL_NUMBERING" },
"graphic": null,
"retryable": true,
"environment": "PRODUCTION",
"failure": {
"code": "PROVIDER_TIMEOUT",
"scope": "TECHNICAL",
"message": "El proveedor fiscal no respondió dentro del tiempo configurado."
}
}
FAILED_RETRYABLE — no hay, pero puede haber
FAILED_RETRYABLE — no hay, pero puede haber
PENDING, acá sabemos con
certeza que no se numeró nada.Imprimí provisional, inyectá la orden y reintentá con el mismo orderCode.{
"requestStatus": "FAILED_RETRYABLE",
"document": null,
"printing": { "printable": false, "mode": "PROVISIONAL_RECEIPT", "reason": "AWAITING_FISCAL_NUMBERING" },
"graphic": null,
"retryable": true,
"environment": "PRODUCTION",
"failure": {
"code": "PROVIDER_UNAVAILABLE",
"scope": "TECHNICAL",
"message": "El servicio de fiscalización no está disponible."
}
}
FAILED_FINAL — no hay, y reintentar no sirve
FAILED_FINAL — no hay, y reintentar no sirve
failure.message, que trae el
motivo real, y failure.scope, que dice a quién le toca arreglarlo:FUNCTIONAL— hay un dato que el ente no acepta. Se corrige en la venta o en la configuración de la tienda.TECHNICAL— la integración con el proveedor está rota. La venta está bien; lo que falla es la conexión con quien numera. Nadie en la caja puede resolverlo.
fiscalRequestId. Con CONTINUE, la venta queda cobrada sin comprobante fiscal — eso también viaja
en los eventos de la orden, para que puedas compensarlo. Con REFUND no hay orden ni
evento: la única traza es el reporte de venta perdida.{
"requestStatus": "FAILED_FINAL",
"document": null,
"printing": { "printable": false, "mode": "PROVISIONAL_RECEIPT", "reason": "FISCAL_REJECTED" },
"graphic": null,
"retryable": false,
"environment": "PRODUCTION",
"failure": {
"code": "FISCAL_BUSINESS_RULE",
"scope": "FUNCTIONAL",
"message": "identidad fiscal no configurada: EC / la tienda K004 no está cargada en el catálogo de identidades fiscales"
}
}
{
"requestStatus": "FAILED_FINAL",
"document": null,
"printing": { "printable": false, "mode": "PROVISIONAL_RECEIPT", "reason": "FISCAL_REJECTED" },
"graphic": null,
"retryable": false,
"environment": "SANDBOX",
"failure": {
"code": "PROVIDER_AUTH_FAILED",
"scope": "TECHNICAL",
"message": "clave de API inválida"
},
"company": {
"legalName": "INT FOOD SERVICES CORP S.A.",
"tradeName": "KFC",
"govIdType": "RUC",
"govIdNumber": "1791415132001",
"headquartersAddress": "PICHINCHA / QUITO / COREA 126 Y AV. AMAZONAS",
"countryLines": [],
"legends": []
},
"timestamps": {
"requestedAt": "2026-08-18T21:36:58.702Z",
"respondedAt": "2026-08-18T21:36:59.617Z",
"providerLatencyMs": 742
}
}
PROVIDER_AUTH_FAILED no es una caída del proveedor. Contestó, y rápido: en el
ejemplo, 742 ms. Lo que rechazó es nuestra credencial —equivocada, revocada o rotada
del otro lado—, así que es configuración y no algo transitorio: por eso retryable
es false y el estado es FAILED_FINAL y no PENDING.Si en vez de esto ves PROVIDER_TIMEOUT con requestStatus: "PENDING", ahí sí el
proveedor no contestó a tiempo — y ahí sí conviene reintentar.Fijate también en el bloque company del ejemplo: llega la identidad para el
encabezado, pero countryLines y legends vienen vacíos porque no hay comprobante
que declare nada.NOT_APPLICABLE — esta tienda no numera
NOT_APPLICABLE — esta tienda no numera
fiscalRequestId: null).Imprimí tu ticket habitual e inyectá la orden con normalidad. Es la respuesta esperada para
agregadores, países sin gateway fiscal y comercios con la numeración desactivada.{
"fiscalRequestId": null,
"requestStatus": "NOT_APPLICABLE",
"document": null,
"printing": { "printable": false, "mode": "NONE", "reason": "NUMBERING_DISABLED" },
"graphic": null,
"failure": null,
"documentStatus": null,
"idempotencyKey": null,
"store": {
"code": "K000",
"name": "Laboratorio Ecuador",
"address": "PICHINCHA / QUITO / AV. AMAZONAS Y AV COREA",
"city": "Quito",
"phone": "023920070",
"govIdType": "RUC",
"govIdNumber": "1791415132001"
},
"company": {
"legalName": "INT FOOD SERVICES CORP S.A.",
"tradeName": "KFC",
"govIdType": "RUC",
"govIdNumber": "1791415132001",
"countryLines": [],
"legends": []
}
}
store y company vienen igual acá. No se numeró nada, así que llega la identidad
del emisor y no el aparato fiscal (countryLines y legends vacíos). Es el mismo bloque
que en cualquier otra respuesta: no hay una forma distinta que aprender para este caso.4xx — el problema está en la petición
4xx — el problema está en la petición
404 con un mensaje de tienda no encontrada, revisá que tu API key sea la del
vendor dueño de esa tienda — el mensaje incluye contra qué vendor se buscó.El 400 de tienda que no puede emitir trae la identidad del emisor en data. Es el
caso de una tienda sin RUC o sin habilitar: la venta ya ocurrió y tenés que imprimir un
provisional igual, así que el encabezado viaja con el error.{
"success": false,
"error": "VALIDATION_ERROR",
"message": "La tienda no tiene identificador tributario del emisor configurado (settings.fiscal.govIdNumber)",
"data": {
"storeCode": "K000",
"store": { "code": "K000", "name": "Laboratorio Ecuador", "address": "…" },
"company": { "legalName": "INT FOOD SERVICES CORP S.A.", "countryLines": [], "legends": [] }
}
}
200 con requestStatus: "NOT_APPLICABLE" y
printing.mode: "NONE" — imprimís tu ticket y seguís. No es un error y no se crea
ninguna solicitud.Es la misma rama que ya tenés: ramificás por printing.mode, no por el código HTTP.Anular
Mandás el mismoorderCode de la venta con operation: "CANCEL". Nada más.
Mandá el mismo cuerpo, totals y client incluidos. La anulación no es un borrado: emite
un documento nuevo —una nota de crédito— que el proveedor calcula con los mismos datos que
la factura.
La anulación es total en todos los países: no existen anulaciones parciales, así que los
importes que mandás son los de la venta completa. Qué documento se compensa lo resuelve Fire
por el orderCode — eso sí, no lo mandes vos.
{
"orderCode": "EC-K004-42-1786579046934",
"createdAt": "2026-08-12T19:10:00.000Z",
"operation": "CANCEL",
"store": { "code": "K004" },
"device": { "uid": "kiosk-01", "name": "KIOSK", "platform": "android" },
"metadata": {}
}
| Factura | Anulación | |
|---|---|---|
document.documentType | SALE_INVOICE | CREDIT_NOTE |
document.documentLabel | FACTURA | NOTA DE CREDITO RIDE |
document.compensates | null | el documento que anula |
005-004-000000068 y su anulación 005-004-000000002. Son dos
secuencias distintas bajo el mismo establecimiento y punto de emisión.GET /numbering?orderCode=… devuelve dos documentos para esa orden.La política puede decir que no
En v1 unCANCEL siempre numera; acá Fire le pregunta primero a la política de
cancelación de la cuenta, y si no lo permite, no se numera nada. Dos pasos, en este orden:
Fire encuentra el documento original
Fire le pregunta a la política de cancelación
Numera, o bloquea
201,
document.compensates apuntando al documento anulado. Si niega, no se numera nada: 200,
requestStatus: "BLOCKED_BY_POLICY", document: null y el motivo en
policy.cancellation.POST /cancel—, pero acá sería pedirle a
este endpoint que la nota exista antes de emitirla: es justamente lo que está por crear.Tampoco corre la del día de negocio, por la misma razón: es una condición para cancelar la
orden, no para anular el comprobante.La pregunta que se hace acá es «¿se puede anular esta venta?», no «¿se puede cancelar
esta orden?». Esa la contesta
Elegibilidad de cancelación.DENY explícito bloquea.200 y no un 4xx. En este endpoint el código HTTP
describe qué pasó con la SOLICITUD, no con el documento — y esa decisión es anterior a la
política: el rechazo definitivo del ente también sale con 200, y un vendor sin
representación fiscal también. Si el ente tributario diciendo «no» es un 200, nuestra
política diciendo «no» no puede ser un 409: tu canal lo leería como un error de transporte y
reintentaría algo que no va a cambiar por insistir.
La respuesta bloqueada se calca a propósito de NOT_APPLICABLE, que tu canal ya maneja: mismo
document: null, mismo printing.mode: "NONE" (con reason: "CANCELLATION_NOT_ALLOWED").
Si ramificás por printing.mode — que es lo que esta página ya te pide hacer — un NONE ya
te protege de imprimir un comprobante inválido. Dos cosas a tener en cuenta:
retryable: false. Insistir no cambia la respuesta de la política. Lo que tiene que cambiar es la configuración de la cuenta, o la orden — no la solicitud.policy.numberingFailure.lostSaleReasonesnull. Una anulación bloqueada NO es una venta perdida: la venta sigue vigente y su plata también. Reportarla pondría en el cierre de caja un dinero que nunca se devolvió.
policy.cancellation.reason y reasonDetail: es, en o pt.Va en la URL:POST https://app.fire.rest/api/v2/external/fiscal/numbering?locale=pt
BLOCKED_BY_POLICY no se persiste nunca. No se numeró nada, así que no hay documento
que conciliar: no aparece en las consultas por
fiscalRequestId ni por
orderCode. Si necesitás el veredicto, está en
la respuesta de esta llamada — y solo ahí.Si no hay nada que anular
Si la venta nunca se numeró —porque la tienda no factura, o porque la numeración falló— la anulación responde400:
{
"success": false,
"error": "VALIDATION_ERROR",
"message": "No existe un documento emitido para esa orden al que referenciar la nota de crédito"
}
400, no un fallo dentro de un 200. Es la única diferencia importante entre
anular y facturar: al facturar, un rechazo del ente viaja como respuesta exitosa con
requestStatus: "FAILED_FINAL", porque es la respuesta a tu pregunta. Acá no hay pregunta
que responder — pediste compensar algo que no existe.Tu punto de venta imprime su comprobante de anulación interno y sigue.Cuando la anulación no se resuelve en el momento
Anular tiene los mismos desenlaces inciertos que facturar, y conviene decirlo porque es fácil asumir que anular siempre cierra.requestStatus | Qué pasó | Qué hacer |
|---|---|---|
GENERATED | La anulación quedó numerada | Nada |
PENDING | No se sabe. El proveedor no contestó | Consultar por orderCode |
FAILED_RETRYABLE | Falló y se puede reintentar | Reintentar con el mismo orderCode |
FAILED_FINAL | El ente rechazó la anulación | La factura original sigue vigente |
FAILED_FINAL, el
comprobante original no se compensó y sigue produciendo efectos fiscales. No es un estado
intermedio del que el sistema salga solo: no hay reintento automático.Medido en producción sobre 72 órdenes canceladas: 67 cerraron el circuito, 3 quedaron
esperando confirmación y 2 fueron rechazadas. Ese ~7% no se resuelve sin intervención.Cuando el instrumento no es una nota de crédito
En Ecuador la anulación produce un documento nuevo. En otros países no: en Brasil es un evento de cancelamento que no genera comprobante, y ahí la respuesta llega constatus: "CANCELLED" y document: null. No es un error — es el desenlace correcto de esa
operación en ese país.
Por eso pedís operation y no un tipo de documento: el instrumento lo decide el régimen.
Consultar una solicitud
Son dos endpoints de lectura, y existen para cuando el camino normal no alcanza: perdiste la respuesta síncrona, o querés ver si el ente ya autorizó sin esperar el evento. En la operación diaria no deberías necesitarlos — los datos llegan por los eventos de la orden.- Por identificador —
GET /numbering/{fiscalRequestId}. - Por orden —
GET /numbering?orderCode=…. Devuelveitems[], porque una orden puede tener dos documentos: la factura y la anulación que la compensa. Es el que usás cuando perdés la respuesta por un corte de red — elorderCodees lo único que tenés en la mano.
documentStatus pasa a AUTHORIZED.
/api/v2/…, reexportadas de v1 sin cambios:
consultar no cambia con la política de cancelación. Un CANCEL que volvió
BLOCKED_BY_POLICY nunca aparece acá — no se numeró nada, así que no hay nada guardado
que devolver.{
"orderCode": "EC-K004-42-1786579046934",
"createdAt": "2026-08-12T17:26:09.386Z",
"operation": "INVOICE",
"store": { "code": "K004" },
"device": { "uid": "kiosk-01", "name": "KIOSK", "platform": "android" },
"totals": [
{
"currencyCode": "USD",
"total": 10,
"subtotalWithoutTaxes": 8.7,
"taxValue": 1.3,
"taxes": [
{ "name": "IVA", "base": 8.7, "rate": "0.15", "amount": 1.3 }
]
}
],
"client": {
"uid": "8Z35YvBbgKVj67AJwZ3nFmAqrtk1",
"name": "CONSUMIDOR",
"lastName": "FINAL",
"email": "consumidor.final@kfc.com.ec",
"phone": "2222222",
"govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000",
"externalId": "",
"additionalInfo": {
"fiscal": "",
"gender": "",
"birthdate": ""
},
"billingInformation": {
"email": "",
"phone": "2222222",
"address": "",
"govIdType": "FINAL_CONSUMER",
"externalId": "",
"govIdNumber": "00000000000",
"businessName": ""
}
},
"metadata": {}
}
{
"orderCode": "CO-K039-1786901234",
"createdAt": "2026-08-16T14:03:22.145Z",
"operation": "INVOICE",
"store": { "code": "K039" },
"device": { "uid": "52CAEA5A18D9B75F", "name": "CAJA 3", "platform": "android" },
"client": {
"name": "Consumidor",
"lastName": "final",
"govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000"
},
"totals": [
{
"currencyCode": "COP",
"total": 50000,
"subtotalWithoutTaxes": 42016.81,
"taxValue": 7983.19,
"taxes": [
{ "name": "IVA", "base": 42016.81, "rate": "0.19", "amount": 7983.19 }
]
}
],
"metadata": {}
}
{
"orderCode": "EC-K004-42-1786579046934",
"createdAt": "2026-08-12T19:10:00.000Z",
"operation": "CANCEL",
"store": { "code": "K004" },
"device": { "uid": "kiosk-01", "name": "KIOSK", "platform": "android" },
"client": {
"uid": "8Z35YvBbgKVj67AJwZ3nFmAqrtk1",
"name": "CONSUMIDOR",
"lastName": "FINAL",
"email": "consumidor.final@ejemplo.com",
"phone": "2222222",
"govIdType": "FINAL_CONSUMER",
"govIdNumber": "00000000000",
"externalId": "",
"additionalInfo": { "fiscal": "", "gender": "", "birthdate": "" },
"billingInformation": {
"email": "", "phone": "2222222", "address": "",
"govIdType": "FINAL_CONSUMER", "externalId": "",
"govIdNumber": "00000000000", "businessName": ""
}
},
"totals": [
{
"currencyCode": "USD",
"total": 10,
"subtotalWithoutTaxes": 8.7,
"taxValue": 1.3,
"taxes": [
{ "name": "IVA", "base": 8.7, "rate": "0.15", "amount": 1.3 }
]
}
],
"metadata": {}
}
{
"success": true,
"data": {
"fiscalRequestId": "8d5b425c-87d2-4848-ab74-517a0ca2743e",
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": {
"documentType": "SALE_INVOICE",
"documentLabel": "FACTURA",
"documentNumber": "005-004-000000011",
"authorizationMode": "ONLINE",
"authorizationLabel": "EMISION NORMAL",
"issuedAt": "2026-08-12T23:57:47.118Z",
"compensates": null
},
"countryData": {
"numeroComprobante": "005-004-000000011",
"claveAcceso": "1208202601000000000000110050040000000111234567811",
"establecimiento": "005",
"puntoEmision": "004",
"secuencial": "000000011",
"ambiente": "PRODUCCION"
},
"store": {
"code": "K004", "name": "Sucursal Amazonas",
"address": "AV. AMAZONAS N36-15", "city": "Quito", "phone": "022222222",
"govIdType": "RUC", "govIdNumber": "1791415132001",
"secondaryGovIdType": null, "secondaryGovIdNumber": null
},
"company": {
"legalName": "INT FOOD SERVICES CORP SA",
"tradeName": "KFC",
"govIdType": "RUC",
"govIdNumber": "1791415132001",
"headquartersAddress": "PICHINCHA / QUITO / INAQUITO / COREA 126 Y AV. AMAZONAS",
"countryLines": [
{ "key": "granContribuyente", "label": "GRAN CONTRIBUYENTE", "value": "NAC-GCFOIOC21-00000900-E" },
{ "key": "contribuyenteEspecial", "label": "CONTRIBUYENTE ESPECIAL", "value": "155" },
{ "key": "obligadoContabilidad", "label": "Obligado a llevar contabilidad", "value": "SI" }
],
"legends": [
{ "key": "avisoCambios", "text": "Estimado cliente: Por favor verifique los datos de su factura…" }
]
},
"graphic": { "qr": "1208202601000000000000110050040000000111234567811" },
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "GENERATED" }
},
"cancellation": null
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"failure": null,
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": { "deviceUid": "4B8E21F9A0D35C7A", "externalStoreCode": "K000" }
}
}
{
"success": true,
"data": {
"fiscalRequestId": "c1a7f0e2-9b34-4d21-8e55-3f60ab12cd90",
"orderCode": "CO-K039-1786901234",
"idempotencyKey": "2f81dcb4-77a0-4c19-9e3b-5a04e7f1b2c8",
"reused": false,
"countryCode": "CO",
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": {
"documentType": "SALE_INVOICE",
"documentLabel": "FACTURA ELECTRONICA DE VENTA",
"documentNumber": "SETP990000001",
"authorizationMode": "ONLINE",
"authorizationLabel": "VALIDACION PREVIA",
"issuedAt": "2026-08-16T14:21:03.118Z",
"compensates": null
},
"countryData": {
"numeroComprobante": "SETP990000001",
"cufe": "9c4f1e… (96 caracteres hexadecimales)",
"prefijo": "SETP",
"numeroDian": "990000001",
"qrCode": "https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey=9c4f1e…",
"ambiente": "PRODUCCION"
},
"store": {
"code": "K039", "name": "Sucursal Chapinero",
"address": "CRA 13 # 63-39", "city": "Bogotá", "phone": "6013334444",
"govIdType": "NIT", "govIdNumber": "9001234567",
"secondaryGovIdType": null, "secondaryGovIdNumber": null
},
"company": {
"legalName": "COMERCIALIZADORA ANDINA S.A.S.",
"tradeName": "KFC",
"govIdType": "NIT",
"govIdNumber": "9001234567",
"headquartersAddress": "BOGOTA D.C. / CHAPINERO / CRA 13 # 63-39",
"countryLines": [
{ "key": "regimen", "label": "REGIMEN", "value": "RESPONSABLE DE IVA" },
{ "key": "resolucion", "label": "RESOLUCION DIAN", "value": "18760000001" }
],
"legends": []
},
"graphic": null,
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "GENERATED" }
},
"cancellation": null
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"failure": null,
"timestamps": {
"requestedAt": "2026-08-16T14:21:02.6Z",
"respondedAt": "2026-08-16T14:21:03.3Z",
"providerLatencyMs": 712
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": { "externalStoreCode": "K039" }
}
}
{
"success": true,
"data": {
"fiscalRequestId": "b73b2fd9-c7a6-42bd-815f-d39c210983ef",
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": "1e07b0e1-784b-40b9-8903-0326361ebefd",
"reused": false,
"countryCode": "EC",
"requestStatus": "GENERATED",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": {
"documentType": "CREDIT_NOTE",
"documentLabel": "NOTA DE CREDITO RIDE",
"documentNumber": "005-004-000000002",
"authorizationMode": "ONLINE",
"authorizationLabel": "EMISION NORMAL",
"issuedAt": "2026-08-14T18:32:32.242Z",
"compensates": {
"documentNumber": "005-004-000000068",
"issuedAt": "2026-08-14T18:31:57.649Z",
"reason": "ORDER_CANCELLATION",
"reasonLabel": "Anulación de pedido"
}
},
"countryData": {
"numeroComprobante": "005-004-000000002",
"claveAcceso": "1408202604179141513200110050040000000021234567815",
"establecimiento": "005",
"puntoEmision": "004",
"secuencial": "000000002",
"ambiente": "PRODUCCION"
},
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "GENERATED" }
},
"cancellation": {
"canCancel": true,
"outcome": "ALLOW",
"code": null,
"reason": null,
"reasonDetail": null,
"source": "default",
"threshold": null,
"resolvedAt": "2026-08-21T21:59:56.100Z",
"resolvedFrom": {
"orderStatus": "COMPLETED",
"fiscalStatus": "authorized",
"countryCode": "EC",
"isFinalConsumer": "false",
"minutesSinceAuthorization": "4"
}
}
},
"printing": { "printable": true, "mode": "FISCAL_DOCUMENT", "reason": null },
"graphic": { "qr": "1408202604179141513200110050040000000021234567815" },
"failure": null,
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": { "deviceUid": "4B8E21F9A0D35C7A", "externalStoreCode": "K000" }
}
}
{
"success": true,
"data": {
"fiscalRequestId": null,
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": null,
"reused": false,
"countryCode": "EC",
"requestStatus": "BLOCKED_BY_POLICY",
"documentStatus": null,
"retryable": false,
"environment": null,
"document": null,
"countryData": null,
"store": {
"code": "K004", "name": "Sucursal Amazonas",
"address": "AV. AMAZONAS N36-15", "city": "Quito", "phone": "022222222",
"govIdType": "RUC", "govIdNumber": "1791415132001",
"secondaryGovIdType": null, "secondaryGovIdNumber": null
},
"company": {
"legalName": "INT FOOD SERVICES CORP SA",
"tradeName": "KFC",
"govIdType": "RUC",
"govIdNumber": "1791415132001",
"headquartersAddress": "PICHINCHA / QUITO / INAQUITO / COREA 126 Y AV. AMAZONAS",
"countryLines": [],
"legends": []
},
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T22:03:11.412Z",
"configVersion": null,
"resolvedFrom": {}
},
"cancellation": {
"canCancel": false,
"outcome": "DENY",
"code": "CANCELLATION_POLICY_DENIED",
"reason": "Ventana de anulación superada",
"reasonDetail": "Esta cuenta solo permite anular dentro de los 30 minutos posteriores a la autorización del comprobante.",
"source": "account",
"threshold": {
"field": "minutesSinceAuthorization",
"threshold": 30,
"actual": 47
},
"resolvedAt": "2026-08-21T22:03:11.412Z",
"resolvedFrom": {
"orderStatus": "COMPLETED",
"fiscalStatus": "authorized",
"countryCode": "EC",
"isFinalConsumer": "false",
"minutesSinceAuthorization": "47"
}
}
},
"printing": { "printable": false, "mode": "NONE", "reason": "CANCELLATION_NOT_ALLOWED" },
"graphic": null,
"failure": null,
"timestamps": {
"requestedAt": "2026-08-21T22:03:11.412Z",
"respondedAt": "2026-08-21T22:03:11.412Z",
"providerLatencyMs": null
},
"correlationId": null,
"providerCode": null,
"providerIdentity": null,
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": "81670b02-4073-4e50-adca-e3c9917e7006",
"orderCode": "EC-K004-42-1786579046934",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "PENDING",
"documentStatus": "PENDING",
"retryable": true,
"environment": "PRODUCTION",
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "REFUND",
"lostSaleReason": "FISCAL_NUMBERING_FAILED",
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": "fnv1a:d096701f",
"resolvedFrom": {
"retryable": "true",
"operation": "INVOICE",
"requestStatus": "PENDING",
"failureScope": "TECHNICAL",
"failureCode": "PROVIDER_UNREACHABLE",
"storeCode": "K004"
}
}
},
"printing": {
"printable": false,
"mode": "PROVISIONAL_RECEIPT",
"reason": "AWAITING_FISCAL_NUMBERING"
},
"failure": {
"code": "PROVIDER_UNREACHABLE",
"scope": "TECHNICAL",
"message": "No se pudo establecer comunicación con el proveedor fiscal."
},
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": null,
"providerLatencyMs": null
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": null, "version": null, "reference": null },
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": "c4f0a1e2-5d3b-4f77-9a10-6b2e8c4d1f03",
"orderCode": "EC-K000-42-1786579046934",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "FAILED_RETRYABLE",
"documentStatus": "PENDING",
"retryable": true,
"environment": "PRODUCTION",
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": "FISCAL_NUMBERING_FAILED",
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": {
"retryable": "true",
"operation": "INVOICE",
"requestStatus": "FAILED_RETRYABLE",
"failureScope": "TECHNICAL",
"failureCode": "PROVIDER_UNAVAILABLE",
"storeCode": "K000"
}
}
},
"printing": {
"printable": false,
"mode": "PROVISIONAL_RECEIPT",
"reason": "AWAITING_FISCAL_NUMBERING"
},
"failure": {
"code": "PROVIDER_UNAVAILABLE",
"scope": "TECHNICAL",
"message": "El servicio de fiscalización no está disponible."
},
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": "1d10c5b9-9f1b-4c62-a425-238110ce9cd6",
"orderCode": "EC-UIO-9-1786580272803",
"idempotencyKey": "9305c960-2304-4b37-a845-fea3a38daa5e",
"reused": false,
"countryCode": "EC",
"requestStatus": "FAILED_FINAL",
"documentStatus": "PENDING",
"retryable": false,
"environment": "PRODUCTION",
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "REFUND",
"lostSaleReason": "FISCAL_NUMBERING_FAILED",
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": "fnv1a:d096701f",
"resolvedFrom": {
"retryable": "false",
"operation": "INVOICE",
"requestStatus": "FAILED_FINAL",
"failureScope": "FUNCTIONAL",
"failureCode": "FISCAL_BUSINESS_RULE",
"storeCode": "UIO"
}
}
},
"printing": {
"printable": false,
"mode": "PROVISIONAL_RECEIPT",
"reason": "FISCAL_REJECTED"
},
"failure": {
"code": "FISCAL_BUSINESS_RULE",
"scope": "FUNCTIONAL",
"message": "identidad fiscal de tienda no configurada: EC / tienda EC-UIO-001"
},
"timestamps": {
"requestedAt": "2026-08-12T23:57:46.7Z",
"respondedAt": "2026-08-12T23:57:47.2Z",
"providerLatencyMs": 406
},
"correlationId": null,
"providerCode": "hio",
"providerIdentity": { "name": "hio.fiscalization", "version": "dev", "reference": null },
"providerMetadata": null
}
}
{
"success": true,
"data": {
"fiscalRequestId": null,
"orderCode": "EC-K000-42-1786579046934",
"idempotencyKey": null,
"reused": false,
"countryCode": "EC",
"requestStatus": "NOT_APPLICABLE",
"documentStatus": null,
"retryable": false,
"environment": null,
"document": null,
"countryData": null,
"graphic": null,
"policy": {
"numberingFailure": {
"action": "CONTINUE",
"lostSaleReason": null,
"resolvedAt": "2026-08-21T21:59:56.203Z",
"configVersion": null,
"resolvedFrom": { "requestStatus": "NOT_APPLICABLE" }
}
},
"printing": { "printable": false, "mode": "NONE", "reason": "NUMBERING_DISABLED" },
"failure": null,
"store": {
"code": "K000",
"name": "Laboratorio Ecuador",
"govIdType": "RUC",
"govIdNumber": "1791415132001"
},
"company": {
"legalName": "INT FOOD SERVICES CORP S.A.",
"tradeName": "KFC",
"countryLines": [],
"legends": []
},
"timestamps": {
"requestedAt": "2026-08-14T01:01:14.7Z",
"respondedAt": "2026-08-14T01:01:14.7Z",
"providerLatencyMs": null
},
"correlationId": null,
"providerCode": null,
"providerIdentity": null,
"providerMetadata": null
}
}
{
"success": false,
"error": "CONFLICT",
"message": "La Idempotency-Key ya fue usada con un cuerpo distinto"
}

