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)
{ "success": false, "message": "El cliente está inactivo y no puede ser utilizado en documentos."}No autorizado (401, sin cuerpo)
HTTP/1.1 401 UnauthorizedContent-Length: 0Conflicto de estado (400)
{ "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. |