Saltar al contenido principal

Manejo de errores

Vigencia

Los códigos y mensajes de error normalizados descritos aquí aplicarán a partir del 2 de julio de 2026. Antes de esa fecha, los códigos y mensajes pueden ser diferentes a los documentados en esta página.

La API responde los errores en JSON y usa códigos de estado HTTP estándar. Para manejar errores de forma programática, usa code: es un string estable y predecible.

message está pensado para lectura humana. Puede cambiar para mejorar claridad o soportar localización, así que no debería usarse para branching de lógica.

Objeto de error

{
"ok": false,
"message": "La solicitud no es válida.",
"status": 400,
"code": "invalid_request",
"location": "body",
"path": "customer.email",
"errors": [
{
"message": "\"customer.email\" is required",
"code": "required",
"location": "body",
"path": "customer.email"
}
]
}
CampoTipoDescripción
okbooleanSiempre es false en respuestas de error. Puedes ignorarlo para manejo programático.
messagestringMensaje legible para humanos.
statusnumberCódigo de estado HTTP.
codestringCódigo raíz estable para manejar el error.
locationstringUbicación del dato relacionado con el error, por ejemplo body, query, params o files. Sólo se incluye cuando aplica.
pathstringRuta del campo relacionado con el error. Sólo se incluye cuando aplica.
errorsarrayDetalles adicionales. Sólo se incluye cuando hay múltiples errores de validación o detalles externos relevantes.
errors[].messagestringMensaje legible de un detalle.
errors[].codestringSubcódigo del detalle. En errores de validación usa un ValidationErrorCode; en errores externos puede ser el código original del SAT o PAC.
errors[].locationstringUbicación del dato relacionado con el detalle, por ejemplo body, query, params o files.
errors[].pathstringRuta del campo relacionado con el detalle.
errors[].sourcestringFuente externa del detalle, por ejemplo sat o pac. Sólo se incluye para errores externos.

Cómo interpretar los códigos

El code raíz clasifica el resultado principal de la solicitud y es el valor que deberías usar primero para decidir cómo manejar el error.

Los códigos dentro de errors[] son subcódigos de detalle. Sirven para explicar campos inválidos o respuestas externas, pero no reemplazan al code raíz. Pueden ser subcódigos de validación definidos por Facturapi o códigos originales de sistemas externos como SAT o PAC.

Errores de validación

Cuando la petición no cumple el contrato de entrada, el error raíz usa code: "invalid_request". Si hay detalles, errors[] incluye cada campo inválido con path, location y un subcódigo de validación.

Los subcódigos de validación están documentados al final de esta página como subcódigos de detalle porque aparecen en errors[].code, no en error.code.

Errores externos

Algunas operaciones dependen de validaciones o servicios externos, como SAT o PAC. En esos casos, el code raíz sigue siendo un código de Facturapi, por ejemplo invoice_stamping_validation_error.

Si el proveedor externo devuelve detalles útiles, se incluyen en errors[] con su código original:

{
"message": "La factura no pasó la validación de timbrado.",
"status": 400,
"code": "invoice_stamping_validation_error",
"errors": [
{
"message": "El RFC del receptor no se encuentra en la lista de RFC inscritos no cancelados del SAT.",
"code": "CFDI40145",
"source": "sat"
}
],
"ok": false
}

Para códigos de validación de timbrado emitidos por el SAT, consulta la Matriz de errores CFDI 4.0 publicada dentro de la documentación oficial del Anexo 20.

Headers útiles

Algunas respuestas de error incluyen headers útiles para manejo programático u observabilidad:

HeaderDescripción
Retry-AfterSegundos recomendados antes de reintentar. Se incluye en errores con code: "rate_limit_exceeded".
X-Facturapi-Log-IdID de correlación de la solicitud. Puedes conservarlo en tu observabilidad para investigar errores con soporte.

Códigos raíz (error.code)

Esta lista es la referencia documentada de códigos raíz públicos de la API. Podemos agregar nuevos códigos en cualquier momento cuando nuevas funcionalidades o nuevos casos de error lo requieran, pero procuramos mantener esta página actualizada para que las integraciones tengan una referencia predecible.

CommonErrorCode

CódigoDescripción
conflictLa solicitud no puede completarse por un conflicto.
forbiddenNo tienes permiso para realizar esta acción.
internal_errorOcurrió un error interno.
not_foundNo se encontró el recurso solicitado.
unauthorizedNo se pudo autenticar la solicitud.

AuthErrorCode

CódigoDescripción
api_key_invalidLa API key proporcionada no es válida.
api_key_not_allowedEsta API key no puede realizar esta acción.
feature_not_availableEsta funcionalidad no está disponible para tu organización.
live_api_key_requiredEsta operación requiere una API key de producción.
mcp_permission_deniedNo tienes permiso para usar esta herramienta.
missing_credentialsNo se proporcionaron credenciales.
organization_incompleteLa organización no está configurada para realizar esta operación.
subscription_requiredEsta operación requiere una suscripción activa.
subscription_live_access_requiredTu suscripción no permite usar el ambiente de producción.
user_key_invalidLa user key proporcionada no es válida.
user_suspendedEl usuario está suspendido.

RequestErrorCode

CódigoDescripción
idempotency_key_in_useLa idempotency key ya está siendo usada.
rate_limit_exceededSe excedió el límite de solicitudes.
date_range_too_largeEl rango de fechas excede el límite permitido.
image_file_requiredSe requiere un archivo de imagen.
invalid_country_codeEl código de país no es válido.
invalid_dateLa fecha no es válida.
invalid_date_rangeEl rango de fechas no es válido.
invalid_image_fileEl archivo proporcionado no es una imagen válida.
invalid_jsonEl JSON enviado no es válido.
invalid_requestLa solicitud no es válida.
invalid_multipart_form_dataLos datos multipart/form-data no son válidos.
invalid_state_codeEl código de estado no es válido.
invalid_timezoneLa zona horaria no es válida.
multipart_limit_exceededLa solicitud multipart/form-data excede los límites permitidos.
page_too_largeLa página solicitada excede el límite permitido.
payload_too_largeEl payload excede el tamaño máximo permitido.

CustomerErrorCode

CódigoDescripción
customer_could_not_be_resolvedNo se pudo resolver el cliente.
customer_edit_link_not_foundEl enlace de edición del cliente no existe o expiró.
customer_edit_link_unavailableEl enlace de edición del cliente no está disponible.
customer_email_requiredSe requiere un correo electrónico del cliente.
customer_has_invoicesNo se puede eliminar un cliente con facturas asociadas.
customer_not_foundNo se encontró el cliente.
customer_tax_info_unavailableLa información fiscal del cliente no está disponible.

ProductErrorCode

CódigoDescripción
product_not_foundNo se encontró el producto.

SupplierErrorCode

CódigoDescripción
supplier_not_foundNo se encontró el proveedor.

CatalogErrorCode

CódigoDescripción
product_key_not_foundNo se encontró la clave de producto o servicio.
tariff_code_not_foundNo se encontró la fracción arancelaria.
unit_key_not_foundNo se encontró la clave de unidad.

InvoiceErrorCode

CódigoDescripción
invoice_already_stampedLa factura ya fue timbrada.
invoice_not_draftLa factura no es un borrador.
invoice_not_foundNo se encontró la factura.
invoice_not_stampedLa factura no ha sido timbrada.

InvoiceDraftErrorCode

CódigoDescripción
draft_not_ready_to_stampEl borrador no está listo para timbrarse.
draft_update_in_progressEl borrador ya se está actualizando.

InvoiceStampingErrorCode

CódigoDescripción
invoice_stamping_failedNo se pudo timbrar la factura.
invoice_stamping_service_unavailableEl servicio de timbrado no está disponible.
invoice_stamping_validation_errorLa factura no pasó la validación de timbrado.
manifesto_signature_failedNo se pudo firmar el manifiesto.
stamping_in_progressEl timbrado de esta factura ya está en proceso.

InvoiceDeliveryErrorCode

CódigoDescripción
invoice_email_delivery_failedNo se pudo enviar la factura por correo.
invoice_email_recipient_requiredNo tenemos una dirección de correo electrónico registrada para este cliente.
invoice_email_status_not_allowedNo se permite enviar una factura con status {status} por correo.

InvoiceCancellationErrorCode

CódigoDescripción
invoice_cancellation_in_progressLa factura tiene una solicitud de cancelación pendiente.
invoice_cancellation_receipt_unavailableEl acuse de cancelación no está disponible.
invoice_cancellation_failedNo se pudo cancelar la factura.
invoice_cancellation_not_allowedLa cancelación de la factura no está permitida.
invoice_cancellation_not_foundNo se encontró la solicitud de cancelación.
invoice_cancellation_rfc_mismatchEl RFC no coincide para cancelar la factura.
invoice_cancellation_service_unavailableEl servicio de cancelación no está disponible.
invoice_not_cancelableLa factura no puede cancelarse.
invoice_not_cancelable_by_satLa factura no puede cancelarse ante el SAT.
substitution_invoice_canceledLa factura de sustitución ya está cancelada.
substitution_invoice_not_foundNo se encontró la factura de sustitución.
substitution_invoice_requiredSe requiere una factura de sustitución.
substitution_invoice_status_not_allowedLa factura de sustitución no tiene un estatus válido.

ReceiptErrorCode

CódigoDescripción
receipt_expiredEl recibo expiró.
receipt_not_foundNo se encontró el recibo.
receipt_not_openEl recibo no está abierto.

ReceiptInvoicingErrorCode

CódigoDescripción
receipt_invoicing_customer_mismatchLos recibos no pueden facturarse juntos para el mismo cliente.
receipt_invoicing_too_many_itemsLos recibos exceden el límite de conceptos permitidos.
receipt_keys_not_foundNo se encontraron todos los recibos solicitados.

ReceiptGlobalInvoiceErrorCode

CódigoDescripción
global_invoice_too_many_itemsLa factura global excede el límite de conceptos permitidos.
invalid_global_invoice_periodEl periodo de factura global no es válido.

RetentionErrorCode

CódigoDescripción
invalid_retention_complementEl complemento de retención no es válido.
retention_not_foundNo se encontró la retención.
retention_not_stampedLa retención no ha sido timbrada.
retention_not_cancelableLa retención no puede cancelarse.

RetentionDeliveryErrorCode

CódigoDescripción
retention_email_delivery_failedNo se pudo enviar la retención por correo.
retention_email_recipient_requiredNo tenemos una dirección de correo electrónico registrada para este cliente.
retention_email_status_not_allowedNo se permite enviar una retención con status {status} por correo.

RetentionCancellationErrorCode

CódigoDescripción
retention_cancellation_failedNo se pudo cancelar la retención.
retention_cancellation_service_unavailableEl servicio de cancelación de retenciones no está disponible.

RetentionStampingErrorCode

CódigoDescripción
retention_stamping_failedNo se pudo timbrar la retención.
retention_stamping_service_unavailableEl servicio de timbrado de retenciones no está disponible.
retention_stamping_validation_errorLa retención no pasó la validación de timbrado.

OrganizationErrorCode

CódigoDescripción
invalid_operationLa operación no es válida.
invalid_user_idEl usuario no es válido.
organization_not_foundNo se encontró la organización.
subscription_active_requiredLa organización requiere una suscripción activa.

OrganizationSettingsErrorCode

CódigoDescripción
certificate_invalidEl certificado no es válido.
certificate_rfc_mismatchEl RFC del certificado no coincide con la organización.
fiel_invalidLa FIEL no es válida.
fiel_rfc_mismatchEl RFC de la FIEL no coincide con la organización.
organization_settings_invalidLa configuración de la organización no es válida.
organization_tax_info_invalidLa información fiscal de la organización no es válida.

OrganizationInviteErrorCode

CódigoDescripción
invite_email_delivery_failedNo se pudo enviar la invitación por correo.
invite_email_mismatchEl correo no coincide con la invitación.
invite_expiredLa invitación expiró.
invite_not_foundNo se encontró la invitación.
invite_role_unavailableEl rol de la invitación no está disponible.
user_already_in_organizationEl usuario ya pertenece a la organización.

OrganizationAccessErrorCode

CódigoDescripción
organization_admin_access_cannot_be_removedNo se puede remover el acceso de administrador de la organización.
organization_admin_assignment_cannot_be_editedNo se puede editar la asignación de administrador de la organización.
organization_admin_role_cannot_be_deletedNo se puede eliminar el rol de administrador de la organización.
organization_admin_role_cannot_be_editedNo se puede editar el rol de administrador de la organización.
organization_admin_role_requiredSe requiere el rol de administrador de la organización.
organization_id_not_allowedNo se permite enviar organizationId para este scope.
organization_id_requiredSe requiere organizationId para este scope.
owner_access_cannot_be_reassignedNo se puede reasignar el acceso del propietario.
owner_access_cannot_be_removedNo se puede remover el acceso del propietario.
role_has_assigned_usersNo se puede eliminar un rol con usuarios asignados.
role_template_not_foundNo se encontró el template del rol.
role_not_foundNo se encontró el rol.
user_access_not_foundNo se encontró el acceso del usuario.

OrganizationSeriesErrorCode

CódigoDescripción
series_already_existsLa serie ya existe.
series_not_foundNo se encontró la serie.

WebhookErrorCode

CódigoDescripción
webhook_delivery_attempt_not_foundNo se encontró el intento de envío del webhook.
webhook_not_foundNo se encontró el webhook.
webhook_signature_invalidLa firma del webhook no es válida.

ToolErrorCode

CódigoDescripción
tax_id_validation_failedNo se pudo validar el RFC.
tax_id_validation_service_unavailableEl servicio de validación de RFC no está disponible.

Subcódigos de detalle (errors[].code)

Estos valores aparecen dentro de errors[] para explicar detalles específicos del error raíz. No son códigos raíz.

Validación de entrada

Estos subcódigos pueden aparecer cuando el código raíz es invalid_request.

CódigoDescripción
invalid_formatEl valor no cumple el formato esperado.
invalid_lengthEl valor no cumple la longitud permitida.
invalid_typeEl valor no tiene el tipo esperado.
not_allowedEl valor no está permitido para este campo.
requiredFalta un campo requerido.
too_largeEl valor excede el límite permitido.
too_smallEl valor está por debajo del mínimo permitido.
unknown_fieldEl campo no está permitido en esta petición.

Códigos externos

Cuando un sistema externo devuelve un código útil, Facturapi lo conserva en errors[].code y agrega errors[].source para indicar cómo interpretarlo. Por ejemplo, en errores de timbrado, source: "sat" indica que errors[].code corresponde a un código de validación del SAT, como CFDI40145.

Los códigos externos no se enumeran aquí porque pertenecen al sistema que los emite. Para códigos de validación de timbrado emitidos por el SAT, consulta la Matriz de errores CFDI 4.0.