Anular un comprobante
Anular es pedir a SUNAT que deje sin efecto un comprobante que ya aceptó. Es una sola llamada para cualquier tipo; Emitay elige el mecanismo que SUNAT exige para cada uno.
curl https://api.emitay.com/v1/documents/doc_…/void \ -H "Authorization: Bearer $EMITAY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "reason": "Error en el RUC del cliente" }'$cabeceras = @{ Authorization = "Bearer $env:EMITAY_API_KEY"}$cuerpo = @'{ "reason": "Error en el RUC del cliente"}'@Invoke-RestMethod -Method Post ` -Uri https://api.emitay.com/v1/documents/doc_…/void ` -Headers $cabeceras ` -ContentType "application/json; charset=utf-8" ` -Body $cuerpoimport { Emitay } from "emitay";
const emitay = new Emitay(); // toma la llave de EMITAY_API_KEY
const anulado = await emitay.documents.void("doc_…", { reason: "Error en el RUC del cliente",});reason es el motivo que se informa a SUNAT, de 3 a 100 caracteres.
La anulación también es asíncrona
Sección titulada «La anulación también es asíncrona»La respuesta es el comprobante, con su status sin cambiar y la anulación en curso:
{ "id": "doc_…", "status": "accepted", "void": { "status": "pending", "reason": "Error en el RUC del cliente", "requested_at": "2026-10-08T22:41:07.000Z", "sunat": null }}SUNAT responde después, y llega como evento:
| Evento | Cómo queda el comprobante |
|---|---|
document.voided |
status: "voided" y void.status: "accepted" |
document.void_failed |
Como estaba, con void.status: "rejected" y el código y mensaje de SUNAT en void.sunat |
Una anulación que SUNAT rechazó se puede volver a pedir.
Qué mecanismo usa cada comprobante
Sección titulada «Qué mecanismo usa cada comprobante»No cambia tu código, pero explica los tiempos: una baja o un resumen los procesa SUNAT por lotes y pueden tardar más que una emisión.
| Comprobante | Mecanismo de SUNAT |
|---|---|
| Factura y sus notas | Comunicación de baja |
| Boleta y sus notas | Resumen diario |
| Retención y percepción | Resumen de reversión |
| Guía de remisión | No se anula por la API (ver abajo) |
Cuándo se puede
Sección titulada «Cuándo se puede»Toda negativa es un 409 conflict con el motivo en detail:
- Solo un comprobante aceptado (
accepteduobserved). Unopendingaún no tiene respuesta, unorejectedno tiene nada que anular y unovoidedya lo está. - Dentro del plazo. Facturas, boletas y sus notas, hasta el sétimo día calendario posterior a su fecha de emisión. Pasado ese día, corresponde una nota de crédito, y el mensaje lo dice.
- Sin otra anulación en curso para ese comprobante.
Guías de remisión
Sección titulada «Guías de remisión»SUNAT no ofrece un servicio para anular guías: la baja se registra en SUNAT Operaciones en
Línea, antes de iniciar el traslado o, ya iniciado, si cambia el destinatario. La API
responde 409 y lo explica. La guía corregida es una guía nueva, con otro número.
Que no se anule dos veces
Sección titulada «Que no se anule dos veces»La anulación acepta Idempotency-Key: repetir la llamada con la misma llave
devuelve el comprobante como está ahora, en lugar de un 409 por «anulación en curso». El
SDK pone una por su cuenta.