Ir al contenido

Errores

Toda respuesta de error es application/problem+json (RFC 9457). Este ejemplo es la respuesta a una solicitud con Accept-Language: es:

{
"type": "https://flashpi.com.ec/docs/errors/validation_failed",
"title": "Error de validación",
"status": 422,
"detail": "Uno o más campos no son válidos. Revisa errors para ver el detalle.",
"instance": "/v1/invoices",
"code": "validation_failed",
"errors": [
{ "field": "customer.id", "code": "invalid_check_digit", "message": "El dígito verificador de este número de identificación es incorrecto." },
{ "field": "items[0].quantity", "code": "invalid_decimal", "message": "Este campo debe ser un número decimal escrito como texto con punto, con máximo 6 decimales." }
],
"requestId": "01a1412b-9c03-7e55-b1a8-27f4d6e0c913"
}
Miembro Descripción
code Un identificador estable en inglés, el mismo en todos los idiomas. Decide según él, nunca según type ni según los textos.
type La página del código (abajo), en el idioma de la respuesta: https://flashpi.com.ec/docs/errors/<code> en español, https://flashpi.com.ec/docs/en/errors/<code> en inglés. Cambia con el idioma, así que no decidas según él.
title, detail Un resumen corto del problema y una explicación de este caso.
status El estado HTTP, repetido.
instance La ruta de la solicitud.
errors[] Los errores de campo (vacío cuando no hay), cada uno con la ruta del campo (field), su code y su message.
requestId El ID de la solicitud, también en el encabezado x-request-id de toda respuesta.

Algunos errores agregan miembros propios, como limit y resetsAt en los límites diarios, expectedTotal y computedTotal en total_mismatch, o documentId en una Idempotency-Key que ya creó un comprobante.

title, detail, errors[].message y los textos de los comprobantes (sriMessages, failure) están en inglés por defecto, y en español cuando la entrada de Accept-Language con la prioridad (q) más alta es es o es- con una región, como es-EC. Content-Language indica qué idioma se usó. El type también sigue el idioma: apunta a la página en inglés del código (/docs/en/errors/<code>) o a la página en español (/docs/errors/<code>). Los códigos nunca cambian con el idioma, así que tu código debe decidir solo según code y errors[].code.

Ventana de terminal
curl https://api.flashpi.com.ec/v1/documents/01a1412b-ae38-7c39-8c71-16d2b5dfc472 \
-H "Authorization: Bearer $FLASHPI_API_KEY" \
-H "Accept-Language: es"

Las respuestas del SRI nunca se reenvían tal cual: Flashpi las traduce a sus propios códigos y textos.

  • Toda respuesta trae x-request-id, un UUIDv7 que genera Flashpi. Es el requestId de los errores y aparece en los request logs de la consola. Inclúyelo cuando escribas a soporte.
  • Puedes enviar X-Correlation-Id (de 1 a 128 letras, dígitos y - _ . : / + =) para relacionar una solicitud con tus propios registros, como tu número de pedido. Flashpi lo devuelve en el mismo encabezado y lo registra junto al ID de la solicitud. Un valor no válido recibe 400 invalid_correlation_id.

Cada código tiene una página en la URL de su type, en español y en inglés, con qué hacer, si conviene reintentar y sus textos en ambos idiomas. La lista sale del catálogo de errores de Flashpi, así que está completa. La mayoría de los códigos vienen de la API de facturación; también se listan los propios de la consola, porque sus respuestas también apuntan a estas páginas.

API de facturación

HTTPCódigoTítulo
400bad_requestSolicitud incorrecta
400malformed_jsonJSON mal formado
400invalid_correlation_idID de correlación no válido
400invalid_idempotency_keyClave de idempotencia no válida
401authentication_requiredAutenticación requerida
401invalid_api_keyAPI key no válida
403key_scope_mismatchAlcance de la API key insuficiente
403key_read_onlyAPI key de solo lectura
403ip_not_allowedDirección IP no permitida
403sandbox_not_enabledSandbox no habilitado
403account_suspendedCuenta suspendida
404not_foundNo encontrado
409conflictConflicto
409idempotency_key_in_progressSolicitud en curso
409issuer_already_existsEl emisor ya existe
409establishment_already_existsEl establecimiento ya existe
409emission_point_already_existsEl punto de emisión ya existe
409resource_in_useRecurso en uso
409issuer_onboarding_not_readyAlta aún no lista
409issuer_onboarding_expiredAlta vencida
409issuer_onboarding_completedAlta ya completada
409issuer_onboarding_rejectedCertificado rechazado
409sequential_already_usedSecuencial ya utilizado
409sequentials_exhaustedSecuenciales agotados
409document_not_authorizedComprobante no autorizado
409ride_not_availableRIDE no disponible
409email_recipient_missingSin destinatario de correo
409email_already_queuedCorreo ya en cola
409email_sending_pausedCorreos de comprobantes pausados
409test_recipient_not_allowedDestinatario de prueba no permitido
409webhook_endpoint_disabledEndpoint de webhooks deshabilitado
409webhook_endpoint_already_verifiedEndpoint de webhooks ya verificado
409webhook_endpoint_not_verifiedEndpoint de webhooks no verificado
409webhook_delivery_in_progressEntrega de webhook en curso
413payload_too_largeContenido demasiado grande
415unsupported_media_typeTipo de contenido no soportado
422validation_failedError de validación
422idempotency_key_reusedClave de idempotencia reutilizada
422total_mismatchEl total no coincide
422document_schema_invalidEl comprobante no cumple el esquema del SRI
422document_too_largeComprobante demasiado grande
429email_resend_limit_reachedLímite de reenvíos alcanzado
429account_email_limit_reachedLímite diario de correos alcanzado
429platform_email_limit_reachedLímite diario de correos de Flashpi alcanzado
429demo_issuer_quota_exceededCuota del emisor de demostración agotada
500internal_errorError interno del servidor
503demo_issuer_unavailableEmisor de demostración no disponible

Consola

HTTPCódigoTítulo
400invalid_tokenEnlace no válido
401invalid_credentialsCredenciales no válidas
403forbiddenAcceso denegado
403email_not_verifiedCorreo no verificado
403email_verification_session_mismatchAbre el enlace donde lo solicitaste
403csrf_check_failedSolicitud rechazada
403reauthentication_requiredConfirma tu identidad
403mfa_reauthentication_requiredConfirma con tu app de autenticación
403mfa_requiredVerificación en dos pasos requerida
403mfa_enrollment_requiredConfigura la verificación en dos pasos
403invitation_email_mismatchInvitación para otro correo
409email_already_verifiedCorreo ya verificado
409password_not_setNo tienes contraseña
409legal_acceptance_requiredAcepta los documentos legales
409mfa_not_enabledLa verificación en dos pasos no está activada
409mfa_enrollment_not_startedNo hay una configuración en curso
409mfa_disable_not_allowedLa verificación en dos pasos es obligatoria
409last_ownerÚltimo propietario
409already_memberYa es miembro
409invitation_requires_loginInicia sesión para aceptar
409live_key_requirements_not_metAcceso de producción no habilitado
429too_many_attemptsDemasiados intentos
503google_sign_in_unavailableInicio con Google no disponible

Reservados (ningún endpoint los devuelve hoy)

HTTPCódigoTítulo
405method_not_allowedMétodo no permitido
406not_acceptableNo aceptable
429rate_limitedDemasiadas solicitudes
503service_unavailableServicio no disponible

Todo 429 trae un encabezado Retry-After con los segundos que debes esperar.

El code de cada elemento de errors[], con el message que trae en español (con Accept-Language: es; en inglés por defecto). {nombre} marca un valor de cada caso, como la cantidad de decimales que admite un campo.

CódigoMensaje (errors[].message)
requiredEste campo es obligatorio.
unknown_fieldEste campo no está permitido.
invalid_typeEste campo tiene un tipo de dato incorrecto.
invalid_formatEste campo tiene un formato no válido.
invalid_optionEste campo debe ser uno de los valores permitidos.
too_shortEste campo es demasiado corto.
too_longEste campo es demasiado largo.
out_of_rangeEste campo está fuera del rango permitido.
invalid_valueEste campo tiene un valor no válido.
unsupported_characterEste campo contiene el carácter {character}, que los comprobantes del SRI no admiten.
not_foundNo existe un recurso con este ID.
invalid_decimalEste campo debe ser un número decimal escrito como texto con punto, con máximo {decimals} decimales.
invalid_identificationEste no es un número de identificación válido del tipo {idType}.
invalid_check_digitEl dígito verificador de este número de identificación es incorrecto.
final_consumer_not_allowedUn consumidor final no puede ser la contraparte de este tipo de comprobante; identifícalo con RUC, cédula, pasaporte o identificación del exterior.
not_in_forceEste valor no está vigente el {date}.
too_many_additional_fieldsUn comprobante admite máximo {max} campos adicionales, y {legends} de ellos los ocupan las leyendas que agrega Flashpi.
reserved_nameEste nombre está reservado para una leyenda que Flashpi agrega automáticamente.
amount_mismatchEstos valores deben sumar {expected}; suman {actual}.
future_dateLa fecha no puede ser posterior a hoy en Ecuador ({today}).
date_too_earlyLa fecha debe ser igual o posterior al {date}.
date_too_lateLa fecha debe ser igual o anterior al {date}.
discount_exceeds_amountEl descuento es mayor que cantidad × precio unitario.
duplicateEste valor solo puede aparecer una vez.
vat_requiredCada línea necesita exactamente un impuesto IVA (usa la tarifa "0", "exempt" o "not_subject" cuando no aplique IVA).
unsupported_taxEste tipo de comprobante no admite este impuesto.
rate_mismatchEl porcentaje de este código es {rate}.
incompatible_issuer_profileEl campo {field} del emisor no se puede escribir en este tipo de comprobante, que acepta máximo {max} caracteres.
url_not_allowedLas URL de webhooks deben ser URL HTTPS públicas y sin credenciales ({reason}).
incorrect_passwordLa contraseña es incorrecta.
invalid_codeEl código es incorrecto o ya venció.
demo_issuer_test_onlyEl emisor de demostración solo puede usarse con API keys de prueba (fp_test_).
demo_issuer_sequential_not_allowedEl emisor de demostración compartido asigna el secuencial; no envíes sequential.
ruc_mismatchEste RUC no coincide con el certificado, que respalda {expected}. Un certificado que solo tiene cédula respalda los RUC cuyos primeros 10 dígitos son esa cédula.