Skip to content

Reconstruir Comprobante ​

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 del comprobante.

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": "john@example.com",
    "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
documentTypestringSíDebe coincidir con el tipo del comprobante original (por ejemplo, "01")
buyer.idTypestringSíCódigo de tipo de identificación del SRI de 2 dígitos
buyer.idstringSíNúmero de identificación del comprador (máx. 20 caracteres)
buyer.namestringSíNombre completo o razón social del comprador (máx. 300 caracteres)
buyer.emailstringSíCorreo 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
itemsarraySíReemplaza todos los ítems existentes, incluyendo los impuestos
items[].mainCodestringSíCódigo principal del producto/servicio
items[].auxiliaryCodestringNoCódigo secundario
items[].descriptionstringSíDescripción (máx. 300 caracteres)
items[].quantitystringSíCantidad numérica
items[].unitPricestringSíPrecio unitario numérico
items[].discountstringNoMonto numérico de descuento
items[].taxesarraySíAl menos un impuesto por ítem
items[].taxes[].codestringSíCódigo de tipo de impuesto del SRI
items[].taxes[].rateCodestringSíCódigo de tarifa de impuesto del SRI
items[].taxes[].ratestringSíPorcentaje de la tarifa de impuesto
items[].taxes[].taxableBasestringSíMonto sobre el que se aplica el impuesto
items[].taxes[].taxAmountstringSíMonto de impuesto calculado
paymentsarraySíReemplaza todas las formas de pago existentes. La suma de total debe ser igual al total de la factura
payments[].methodstringSíCódigo de forma de pago del SRI de 2 dígitos
payments[].totalstringSíMonto 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": "john@example.com"
    },
    "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 — API v1.3.1