Skip to content

Reconstruir Factura

Corrige y vuelve a firmar un comprobante rechazado. El comprobante reconstruido conserva el mismo accessKey, sequential, y issueDate que el original — solo se reemplaza el contenido de la factura.

POST /v1/documents/:accessKey/rebuild

Úsalo cuando un comprobante está en estado RETURNED o NOT_AUTHORIZED. Después de reconstruirlo, envíalo de nuevo con Send to SRI.

Funciona para cualquier tipo de comprobante — la forma del cuerpo debe coincidir con el documentType existente del comprobante. El ejemplo a continuación es para una factura (01); para una nota de crédito (04), usa la forma del cuerpo de Create Credit Note (sin payments, requiere originalDocument + motivo).

Autenticación

Authorization: Bearer <api-key> y X-Issuer-Id: <issuer-id> (UUID de GET /v1/issuers)

Parámetros de ruta

ParámetroDescripción
accessKeyLa clave de acceso de 49 dígitos del comprobante a reconstruir

Cuerpo de la solicitud

json
{
  "documentType": "01",
  "buyer": {
    "idType": "05",
    "id": "1234567890",
    "name": "John Doe",
    "email": "[email protected]",
    "address": "Av. Amazonas 123"
  },
  "items": [
    {
      "mainCode": "PROD-001",
      "auxiliaryCode": "AUX-001",
      "description": "Web development service",
      "quantity": "1.00",
      "unitPrice": "100.00",
      "discount": "0.00",
      "taxes": [
        {
          "code": "2",
          "rateCode": "2",
          "rate": "15.00",
          "taxableBase": "100.00",
          "taxAmount": "15.00"
        }
      ]
    }
  ],
  "payments": [
    {
      "method": "01",
      "total": "115.00",
      "term": 30,
      "termUnit": "dias"
    }
  ],
  "additionalInfo": [
    { "name": "Contract", "value": "CTR-2026-001" }
  ]
}

Qué se conserva del comprobante original

Los siguientes campos siempre se toman del comprobante original y no pueden cambiarse mediante la reconstrucción:

CampoRazón
accessKeyEl SRI vincula todas las verificaciones de estado posteriores a esta clave
sequentialLos números secuenciales se asignan una sola vez y no se reciclan
issueDateEl SRI valida la fecha embebida en la clave de acceso
documentTypeNo se puede cambiar el tipo de un comprobante existente

El campo documentType sigue siendo requerido por la validación, pero debe coincidir con el tipo del comprobante original — el valor proporcionado en el cuerpo se ignora a nivel de servicio.

Qué se puede corregir

Todos los campos de contenido de la factura se reemplazan de forma atómica:

CampoTipoRequeridoDescripción
documentTypestringDebe coincidir con el tipo del comprobante original (por ejemplo, "01")
buyer.idTypestringCódigo de tipo de identificación del SRI de 2 dígitos
buyer.idstringNúmero de identificación del comprador (máx. 20 caracteres)
buyer.namestringNombre completo o razón social del comprador (máx. 300 caracteres)
buyer.emailstringCorreo del comprador — usado cuando se envía el correo de autorización
buyer.addressstringNoDirección del comprador (máx. 300 caracteres)
guiaRemisionstringNoNúmero de guía de remisión en formato NNN-NNN-NNNNNNNNN
itemsarrayReemplaza todos los ítems existentes, incluyendo los impuestos
items[].mainCodestringCódigo principal del producto/servicio
items[].auxiliaryCodestringNoCódigo secundario
items[].descriptionstringDescripción (máx. 300 caracteres)
items[].quantitystringCantidad numérica
items[].unitPricestringPrecio unitario numérico
items[].discountstringNoMonto numérico de descuento
items[].taxesarrayAl menos un impuesto por ítem
items[].taxes[].codestringCódigo de tipo de impuesto del SRI
items[].taxes[].rateCodestringCódigo de tarifa de impuesto del SRI
items[].taxes[].ratestringPorcentaje de la tarifa de impuesto
items[].taxes[].taxableBasestringMonto sobre el que se aplica el impuesto
items[].taxes[].taxAmountstringMonto de impuesto calculado
paymentsarrayReemplaza todas las formas de pago existentes. La suma de total debe ser igual al total de la factura
payments[].methodstringCódigo de forma de pago del SRI de 2 dígitos
payments[].totalstringMonto numérico del pago
payments[].termnumberNoPlazo de pago
payments[].termUnitstringNoUnidad del plazo de pago (por ejemplo, "dias", "meses")
additionalInfoarrayNoReemplaza todas las entradas campoAdicional existentes

El payload original está disponible en el campo requestPayload de la respuesta de Get Document — úsalo para prellenar la solicitud corregida.

Respuesta

200 OK

json
{
  "ok": true,
  "document": {
    "accessKey": "1503202601179234567800110010010000000011234567810",
    "documentType": "01",
    "sequential": "000000001",
    "status": "SIGNED",
    "issueDate": "15/03/2026",
    "total": "120.00",
    "buyer": {
      "id": "1234567890",
      "idType": "05",
      "name": "John Doe",
      "email": "[email protected]"
    },
    "email": {
      "status": "PENDING"
    }
  }
}

Errores

CódigoEstado HTTPCuándo ocurre
VALIDATION_FAILED400El cuerpo de la solicitud falla la validación de campos
VALIDATION_FAILED400La suma de payments[].total no coincide con el total calculado de la factura
BAD_REQUEST400El encabezado X-Issuer-Id falta o está mal formado
INVALID_STATE_TRANSITION400El comprobante no está en estado RETURNED o NOT_AUTHORIZED
UNAUTHORIZED401API key faltante o inválida, o discrepancia de entorno
FORBIDDEN403El emisor de X-Issuer-Id pertenece a otro tenant
NOT_FOUND404El emisor de X-Issuer-Id no existe
NOT_FOUND404Comprobante no encontrado

Documentación de la API de Comprobify