Saltar al contenido
↑↓ navegar ↵ abrir Esc cerrar
Convenciones

Errores y códigos HTTP

factura.com.do retorna las reglas de negocio con un envelope simple: { success: false, message }. La autenticación responde 401 sin cuerpo y los errores de parseo de JSON devuelven 400 con el cuerpo por defecto que emite el binding de Minimal API. Aprende las tres formas y todos los recursos te resultan predecibles.

Resumen

Las reglas de negocio que ejecuta el handler (proveedor inactivo, pagos descuadrados, monto fuera de rango, etc.) devuelven 400 con { success: false, message } y un mensaje en lenguaje natural. La autenticación con X-Api-Key responde 401 sin cuerpo. Los errores de parseo de JSON los maneja el binding de Minimal API: 400 con un cuerpo por defecto, sin ProblemDetails registrado en la aplicación. Cuando el handler lanza una excepción, la respuesta es { error }: 400 si es una validación de argumentos, 404 si falta un recurso y 500 en cualquier otro caso (por ejemplo, cuando no hay una secuencia de NCF activa).

Códigos HTTP

Código Cuando ocurre Acción esperada
200 OK GET con resultado o POST/PUT/DELETE procesado. Anular (void) y DELETE también responden 200 cuando fallan, con success: false Lee success antes de dar la operación por hecha
400 Bad Request JSON malformado, validación de cuerpo o regla de negocio incumplida Lee message y corrige el body
401 Unauthorized Falta o no es válida la X-Api-Key Rotar la llave o renovarla
403 Forbidden La llave es válida, pero el espacio de trabajo no tiene el plan Corporativo Cambia al plan Corporativo
404 Not Found id no existe en tu espacio de trabajo, o la nota referencia una secuencia que no existe Verifica que el recurso pertenezca al tenant
500 Internal Server Error Excepción no controlada, como crear un documento sin secuencia de NCF activa Lee error; si es la secuencia, configúrala en la app. Si no, reintenta con backoff y abre un ticket si persiste

Envelope estándar

Tres ejemplos cubren la mayoría de los casos: regla de negocio sobre el cuerpo, autenticación con cabecera faltante y conflicto sobre el estado del recurso. La forma cambia entre el envelope { success, message } y la respuesta 401 sin cuerpo.

Regla de cuerpo (400)

400-business-rule.json
{
"success": false,
"message": "El cliente está inactivo y no puede ser utilizado en documentos."
}

No autorizado (401, sin cuerpo)

401-unauthorized.txt
HTTP/1.1 401 Unauthorized
Content-Length: 0

Conflicto de estado (400)

400-state-conflict.json
{
"success": false,
"message": "No se puede crear un Comprobante de Compras (E41) para un proveedor registrado en la DGII."
}

Errores comunes

Caso Código Detalle
Subdominio que no corresponde a ningún espacio de trabajo 404 Sin cuerpo
X-Api-Key faltante o vencida 401 Sin cuerpo. Reintenta con la cabecera correcta
Espacio de trabajo sin plan Corporativo 403 El acceso a la API REST está disponible solo en el plan Corporativo.
No hay una secuencia de NCF activa para el tipo 500 No hay secuencia activa para el tipo de documento N
Nota de crédito o débito con referenceSequence inexistente 404 No se encontró un documento con la secuencia 'E310000000001'.
DELETE de un cliente que no existe 200 success: false · CustomerId with ID … not found.
Anular un comprobante que la DGII está validando 200 success: false · Error al anular factura: No se puede anular una factura que está en proceso de validación por la DGII. …
customerId u otro id no existe en el espacio de trabajo 404 Sin cuerpo (recurso no encontrado)
Proveedor inactivo en el catálogo 400 El proveedor está inactivo y no puede ser utilizado en documentos.
E41 con proveedor registrado en DGII 400 No se puede crear un Comprobante de Compras (E41) para un proveedor registrado en la DGII.
Pagos no cuadran con el total del documento 400 La suma de los pagos (RD$ X) no coincide con el monto total del documento (RD$ Y).
edit-amount con propuesta mayor al original 400 El monto propuesto (RD$ X) no puede exceder el total del documento original (RD$ Y).
JSON malformado o tipo inesperado 400 Respuesta del binder de Minimal API; el shape exacto depende de la versión de ASP.NET Core.

Siguientes pasos

Siguiente paso

Continúa por aquí