Errores de la API: qué significa cada código y cómo solucionarlo
FastOG devuelve códigos de error legibles por máquina cuando falla una petición: el render de una imagen OG firmada o una llamada a una de las superficies de administración del producto. Toda respuesta de error incluye:
error— el token corto heredado. Sigue presente en todos los fallos para que un cliente antiguo siga funcionando.code— el mismo código de error estable y documentado (tabla a continuación), con el nombre que usa la API pública.message— una descripción de una frase sobre qué ha fallado.hint— una descripción breve en lenguaje llano de qué ha fallado y cómo solucionarlo.docs_url— un enlace a esta página, anclado en la sección de ese código.request_id— correlaciona este fallo HTTP con una fila de la tabla Render Logs del dashboard (también se devuelve en la cabecera de respuestaX-Request-ID). Una superficie sin nada que correlacionar respondenull, pero la clave siempre está presente.
Las superficies del producto —el admin de Shopify, el WooCommerce Studio, el puente de Wix y la demo— responden
con el mismo envelope para los códigos de abajo, así que un fallo significa lo mismo allí donde te lo encuentres. Una
superficie de módulo puede mantener el estado HTTP que siempre ha devuelto para un código (por ejemplo, render_failed
responde 503 en la exportación de portada y 502 en la API pública); el código, el mensaje, la pista y el enlace a la documentación no cambian.
Leer una respuesta de error
{
"error": "invalid_signature",
"code": "invalid_signature",
"message": "The signature does not match.",
"hint": "The signature did not match. Re-sign with your HMAC secret after every param change.",
"request_id": "5f2a9c1e-..."
}
Si recibes una respuesta que no entiendes, el camino más rápido es:
- Anota el
code. - Revisa tu constructor de URL — la mayoría de los fallos son errores de firma, no problemas de cuenta.
- Consulta el código de abajo para conocer la causa exacta y la solución.
- En el dashboard, abre Render Logs y filtra por el mismo
error_code— cada fila muestra los parámetros solicitados para que puedas reproducirlo (y confirmar querequest_idcoincide).
Firma y autenticación
missing_signature
A tu solicitud le faltan los parámetros de consulta key y/o s (firma).
Solución: asegúrate de que tu URL incluya tanto key=<api-key> como s=<hmac-signature>. Usa el SDK o el recorrido de /docs/hmac-signature-guide para construirla.
invalid_signature
El valor de s no coincidía con lo que produce tu secreto HMAC para esta URL.
Solución: la firma cubre todos los parámetros de consulta excepto s, con las claves ordenadas. Cambiar cualquier parámetro —incluido reordenarlos, diferencias de codificación de URL o añadir espacios en blanco— invalida la firma. Vuelve a firmar después de cada cambio. Confirma que tu secreto es el mismo que se mostró al crear la clave de API.
invalid_signature_format
El valor de s no es una cadena hexadecimal de 64 caracteres.
Solución: la firma debe ser el SHA-256 en hexadecimal sin procesar (minúsculas a-f0-9). Si estás codificando en base64 o truncando la salida, usa hexadecimal simple.
expired_timestamp
La marca de tiempo t que proporcionaste tiene más de 5 minutos de antigüedad.
Solución: vuelve a generar la marca de tiempo cada vez que construyas una URL. Este código se aplica al flujo heredado de URL firmada; el flujo actual de HMAC v2 no tiene marca de tiempo.
invalid_api_key
El key que pasaste no existe.
Solución: copia la clave de API completa desde el panel —es el identificador público que empieza por sk_. Es pública y segura en las URL; el secreto (nunca en las URL) es lo que demuestra la posesión.
missing_hmac_secret
La clave de API no tiene configurado ningún secreto HMAC.
Solución: crea una nueva clave de API en el panel —el secreto HMAC se genera y se muestra una sola vez al crearla.
Parámetro / entrada
invalid_image_url
Una prop que contiene una URL (image, brand_logo, logo, avatar, background_image, ...) no es una URL http(s) pública.
Solución: pasa una URL https://... accesible públicamente. Se rechazan localhost, las IP privadas y las rutas sin dominio para evitar la falsificación de peticiones del lado del servidor.
Suscripción
subscription_required (402)
La solicitud llegó a la Dynamic API, pero tu cuenta no tiene un plan activo. El acceso a la API es solo por suscripción: el plan es la condición indispensable y ofrece la misma cobertura y la misma escala de capacidades que venden las aplicaciones de FastOG. Las renderizaciones en sí no se miden: no hay cuota mensual de renderizaciones ni facturación por exceso.
Solución: elige un plan de Dynamic API en el panel y crea una clave de API. La respuesta incluye un top_up_url que apunta a la página de planes.
Servicio de renderizado
store_blocked (403)
FastOG ha pausado el renderizado de la tienda asociada a esta clave (por ejemplo, por abuso o un uso descontrolado). Las imágenes ya almacenadas en caché en el edge pueden seguir sirviéndose hasta que caduquen. Contacta con soporte para resolverlo; nada de lo que cambies en la petición solucionará esto.
render_unreachable
No se pudo contactar con el servicio de renderizado (ventana breve de reinicio).
Solución: vuelve a intentarlo en unos segundos. El renderizado no se contabilizó en este intento.
render_failed
El servicio de renderizado devolvió un error para tu petición.
Solución: verifica las props de tu plantilla — valores largos o mal formados, campos no admitidos o una imagen de origen inaccesible. La respuesta incluye el status subyacente. El renderizado no se contabilizó.
Superficies de administración de la tienda
Estos códigos responden desde el administrador de Shopify y el WooCommerce Studio — los editores integrados en los que trabaja un comerciante en lugar de la API firmada. Varios se comparten con la API pública (invalid_image_url, render_failed, invalid_signature); esos mantienen la entrada documentada arriba.
| Código | HTTP | Qué significa y qué hacer |
|---|---|---|
invalid_shop |
422 | No se ha podido identificar la tienda de Shopify. Vuelve a cargar la app FastOG desde tu administrador de Shopify para que la petición embebida vuelva a llevar la tienda y, después, reinténtalo. |
invalid_shop_or_page |
422 | La tienda o el tipo de página son desconocidos. Abre la app FastOG desde tu administrador de Shopify y elige un tipo de página de portada en el editor. |
invalid_store |
422 | No se ha podido identificar la tienda de WooCommerce. Vuelve a abrir el Studio desde tu administrador de WordPress para que se vuelva a presentar el token de la tienda y, después, reinténtalo. |
invalid_store_or_page |
422 | La tienda o el tipo de página son desconocidos. Vuelve a abrir el Studio desde tu administrador de WordPress y elige un tipo de página de portada de los que ofrece el editor. |
missing_api_key |
422 | La tienda no tiene clave de firma. Termina de instalar el plugin desde tu administrador de WordPress para que FastOG pueda emitir la clave de firma de la tienda. |
store_ownership_unverified |
403 | No se ha podido verificar el sitio de WordPress. Debe ser accesible mediante HTTPS público con su REST API habilitada. |
community_is_free |
422 | El plan Community es gratuito. Es el plan gratuito por defecto y no se puede comprar; elige un nivel de pago para mejorar el plan. |
not_installed |
404 | FastOG no está instalado para esta tienda. Instala la app FastOG desde la Shopify App Store para esta tienda y vuelve a abrirla. |
oauth_required |
409 | La tienda debe autorizar FastOG de nuevo. Vuelve a ejecutar la instalación OAuth de FastOG desde tu administrador de Shopify; la concesión almacenada se ha revocado o sus scopes han cambiado. |
reconnect_required |
409 | Hay que restablecer la conexión con Shopify. Usa el botón Reconnect de la app FastOG para que se emita un nuevo access token. |
token_rejected |
409 | Shopify emitió un access token y después lo rechazó. Reintenta la reconexión una vez; si Shopify sigue rechazándolo, reinstala la app. |
unauthorized |
401 | La petición no lleva una sesión válida para esta superficie. Vuelve a cargar la app FastOG desde el administrador de tu plataforma para que se adjunte un token de sesión nuevo y, después, reinténtalo. |
shop_not_found |
404 | La tienda ya no existe en FastOG. Reinstala FastOG desde tu administrador de Shopify para volver a crear el registro de la tienda. |
invalid_product |
422 | La referencia del producto no es válida. Vuelve a cargar la página del producto y abre FastOG de nuevo; el id de producto enviado faltaba o no era numérico. |
invalid_product_cover |
422 | El payload de la portada del producto está mal formado. Vuelve a cargar el editor y guarda otra vez; props, style y signals deben ser cada uno un objeto. |
product_not_found |
404 | No se ha podido leer el producto de la tienda. Comprueba que el producto sigue existiendo y está publicado y, después, vuelve a cargar el editor. |
product_customization_not_on_plan |
403 | La personalización de portada por producto no está incluida en este plan. Mejora el plan o edita la portada de producto compartida. |
no_product_handles |
422 | No se ha encontrado ningún producto que actualizar. Publica al menos un producto con un handle público y vuelve a intentar la actualización de la vista previa compartida. |
invalid_style |
422 | El bloque de estilo no es utilizable. Vuelve a cargar el editor y elige de nuevo los colores y las fuentes; un valor no se ha podido normalizar. |
invalid_template |
422 | La plantilla solicitada no está en el catálogo de esta plataforma. Elige uno de los diseños que ofrece el editor. |
invalid_preset |
422 | El nombre del preset no es uno de los que ofrece esta plataforma. Elige un preset en la pantalla de configuración. |
invalid_set |
422 | El payload del conjunto de portadas falta o está mal formado. Vuelve a cargar la pantalla de configuración y elige un conjunto de nuevo. |
preset_not_applyable |
422 | El preset no se puede aplicar a todos los tipos de página. Elige otro preset; a este le falta la portada de al menos un tipo de página. |
template_not_available |
422 | La plantilla no está en el catálogo de plantillas renderizables. Elige un diseño de los que ofrece el selector. |
template_not_available_on_shopify |
422 | La plantilla no está disponible en las tiendas de Shopify. Elige un diseño de los que ofrece el editor de Shopify. |
template_not_available_on_woocommerce |
422 | La plantilla no está disponible en las tiendas de WooCommerce. Elige un diseño de los que ofrece el Studio. |
template_unavailable |
422 | La plantilla no está disponible para esta tienda. Elige un diseño de los que ofrece el editor; está retirada, es desconocida o supera lo que la tienda puede dibujar. |
template_not_on_plan |
403 | La plantilla requiere un plan superior. Cambia de plan o elige un diseño que cubra el plan actual. La respuesta indica el plan en requires. |
template_requires_higher_plan |
403 | La plantilla requiere un plan superior. La respuesta indica el plan en requires. |
no_rule |
404 | Todavía no hay ninguna regla de portada para este tipo de página. Guarda primero una portada para este tipo de página en el editor. |
cover_not_configured |
404 | Todavía no se ha guardado ninguna portada de producto. Guarda una portada de producto antes de descargarla o compartirla. |
schedule_only_product |
422 | La programación de campañas solo existe para las portadas de producto. Elimina la fecha de reversión o traslada la campaña a la portada de producto. |
not_dismissible |
422 | Ese anuncio no se puede descartar. Vuelve a cargar la página; ya se ha retirado o pertenece a otra tienda. |
unsupported_locale |
422 | Ese idioma de la interfaz no está incluido en esta app. Elige uno de los idiomas que la respuesta enumera en supported. |
no_setup_sets |
422 | No se ha podido componer ningún conjunto de portadas seleccionado. Reintenta la pantalla de configuración; si sigue vacía, contacta con soporte. |
export_unavailable |
403 | Las descargas no están incluidas en este plan. Mejora a Pro o superior para descargar los archivos de portada. |
cancellation_failed |
502 | Se ha rechazado la cancelación de la suscripción. Reinténtalo en un momento; si sigue fallando, cancela desde la página de facturación de Shopify o contacta con soporte. |
logo_override_on_plan |
403 | La sustitución del logo no está incluida en este plan. Mejora el plan o borra la sustitución del logo. |
invalid_logo |
422 | El archivo del logo no es una imagen aceptada. Sube un PNG, JPEG o WebP por debajo del límite de tamaño que se muestra en el editor. |
invalid_brand_image |
422 | La imagen de referencia de marca no es utilizable. Sube una imagen compatible por debajo del límite de tamaño o borra la referencia y guarda de nuevo. |
brand_image_too_large |
422 | La imagen de referencia de marca es demasiado grande. Reduce el archivo y vuelve a subirlo. |
brand_colors_too_many |
422 | Se han enviado más de tres colores de marca. Envía como máximo tres colores hex. |
upload_failed |
500 | No se ha podido almacenar el archivo subido. Reinténtalo; si sigue fallando, contacta con soporte: el almacén de assets no ha devuelto ninguna URL pública. |
attachment_upload_failed |
500 | No se ha podido almacenar el adjunto de soporte. Envía el mensaje sin el adjunto y después manda el archivo por correo a soporte. |
invalid_webhook |
401 | La firma del webhook de la tienda no se ha verificado. Comprueba que el secreto del webhook en tus ajustes de FastOG en WordPress coincide con el que emitió FastOG. |
not_found |
404 | Ese endpoint ya no existe. Vuelve a abrir el Studio desde tu administrador de WordPress. |
meta_refresh_unavailable |
503 | La actualización de la vista previa compartida no está configurada. Vuelve a compartir el enlace desde Facebook. |
theme_write_disabled |
409 | La edición de temas no está habilitada para esta app. Usa el app embed del tema en lugar de la corrección del archivo del tema. |
scope_required |
403 | A FastOG le falta un permiso de Shopify. Aprueba los scopes solicitados usando el consent_url de la respuesta y vuelve a intentar la corrección. |
Puente de Wix
El puente de Wix lo firma la app de Wix, no una sesión de comerciante, así que sus fallos van dirigidos al desarrollador de la app. Todas las respuestas siguen incluyendo code y request_id; el id de la petición del puente es el del sobre firmado.
| Código | HTTP | Qué significa y qué hacer |
|---|---|---|
invalid_bridge_signature |
401 | La firma del puente de Wix no se verificó. Vuelve a generar la petición con el secreto compartido, la ruta exacta y una marca de tiempo de menos de cinco minutos. |
invalid_bridge_body |
400 | El cuerpo del sobre del puente está mal formado. Envía body como un objeto JSON y codifica cada número que contenga como una cadena, para que la firma canónica coincida. |
replayed_bridge_request |
401 | Esa petición del puente ya se usó. Genera un nuevo request_id para cada llamada que modifique datos. |
wix_site_not_installed |
403 | FastOG no está instalado en este sitio de Wix. Instala la app de FastOG en el sitio y vuelve a abrirlo. |
wix_site_not_provisioned |
422 | El sitio de Wix aún no tiene credenciales de firma. Reinstala la app de FastOG para que el sitio se aprovisione con una clave de API. |
invalid_page_type |
422 | El tipo de página no es uno de los que FastOG cubre en Wix. Envía uno de los tipos de página que ofrece el Studio. |
rule_not_found |
404 | No hay ninguna regla con ese id. Actualiza la lista; la regla se eliminó o pertenece a otro sitio. |
invalid_target_id |
422 | El id de destino de Wix no es válido para este tipo de página. Envía el id que la app de Wix proporciona para ese tipo de página. |
invalid_preview |
422 | La carga útil de la vista previa está mal formada. Consulta el objeto details para ver el campo que falla. |
invalid_rule |
422 | La carga útil de la regla de portada está mal formada. Consulta el objeto details; template es obligatorio y los bloques opcionales deben ser objetos. |
invalid_sync |
422 | La carga útil de la sincronización está mal formada. Consulta el objeto details; target_type y target_id deben coincidir. |
invalid_regenerate_url |
422 | Falta la URL que hay que regenerar. Envía la URL de la página en url. |
invalid_regenerate_host |
422 | La URL no pertenece al host de FastOG. Envía una URL de portada de fastog.com. |
ai_presets_unsupported |
422 | Los conjuntos de portadas diseñados por IA ya no se generan. Elige uno de los estilos seleccionados. |
original_tags_required |
422 | Las etiquetas de metadatos originales son obligatorias. Envía original_tags (o current_tags) para que una desinstalación pueda restaurar los metadatos del sitio. |
invalid_restored |
422 | La carga útil de las claves restauradas está mal formada. Envía restored como un array de claves de metadatos. |
invalid_seo_target |
422 | El tipo de destino de SEO es desconocido. Usa site, pattern o item en la ruta. |
invalid_seo_payload |
422 | La carga útil de los metadatos de SEO está mal formada. Envía target_id, current_tags y fastog_url como una URL http(s) absoluta. |
sync_failed |
500 | Falló la sincronización de metadatos con Wix. Reinténtalo; si sigue fallando, comprueba que el sitio es accesible y que la app sigue instalada. |
invalid_tier |
422 | Ese plan no es uno de los que FastOG vende en Wix. Envía starter, pro o scale como tier. |
Superficie de la demo
La demo es la consola de ventas exclusiva para el propietario, no un endpoint para comercios.
| Código | HTTP | Qué significa y qué hacer |
|---|---|---|
url_required |
422 | No se envió ninguna URL. Pega el enlace de la tienda o del producto antes de leer la tarjeta. |
unreadable_url |
422 | No se pudo leer esa página. Comprueba que el enlace sea público y esté completo; una página detrás de un inicio de sesión no se puede leer. |
no_api_key |
422 | No hay ninguna clave de API disponible para firmar las portadas. Crea una clave de API (o introduce una válida); la respuesta enlaza a la página de claves de API. |
no_presets |
500 | No hay preajustes de portada configurados. Configura al menos un preajuste en el servidor. |
Códigos del editor de reglas con ámbito
Los editores de reglas con ámbito (el admin de Shopify y WooCommerce Studio) traducen estos tokens por sí mismos, al idioma del propio comerciante, por lo que sus respuestas incluyen error y code pero no hint — una segunda descripción en inglés solo se desviaría de la localizada que el comerciante ve realmente:
scope_already_defined, scoped_rule_limit_reached, scoped_rules_not_on_plan,
scope_value_required, scope_value_too_long, unknown_scope_type, base_rule_required,
scoped_rules_product_only, cannot_delete_base_rule.
¿Sigues atascado?
- Abre la página Render Logs del panel: cada resultado (éxito + rechazo) aparece listado con su
error_code, el estado HTTP y los parámetros solicitados. - Ejecuta
php artisan og:diagnosesobre una URL firmada para recorrer todo el pipeline y ver en qué etapa falla. - Consulta en la barra lateral la documentación del framework que estés usando (Next.js, Express, SvelteKit, ...).