API para desarrolladores, MCP, GitHub y simulación de activadores
Puedes revisar tus activadores, activarlos o desactivarlos, consultar el historial de eventos y simular un activador desde tu propio código o desde un asistente de IA. Workflow Trigger Extensions ofrece una API REST y un servidor MCP, y puede conectarse a un repositorio de GitHub para que tu código de activador personalizado esté bajo control de versiones. Los tres se gestionan en la página «Desarrollador».
Simulación de un disparador
Probar un flujo de trabajo de Flow suele implicar llevar a cabo la acción real en tu tienda: editar un producto, realizar un pedido o esperar a que se realice una encuesta. La simulación elimina esa espera: elige un desencadenante, asócialo a un recurso y se activará como si el evento real acabara de producirse.
Dos formas de ejecutarlo:
- En la aplicación, abre cualquier evento en el «Historial de eventos» y vuelve a seleccionar «Simular». De este modo, se vuelve a activar ese mismo evento.
- A través de la API o del MCP, con un identificador de recurso o un evento anterior.
La simulación es deliberadamente fiel. No crea una carga útil abreviada, sino que sigue el mismo proceso que un webhook real de Shopify, por lo que lo que recibe tu flujo de trabajo es exactamente lo que recibiría en producción.
curl -X POST https://shopify.workflow-trigger-extensions.app/api/v1/triggers/product-update-trigger/simulate \
-H "Authorization: Bearer ftk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"resourceId":"gid://shopify/Product/123456789","dryRun":true}'Una prueba de simulación valida el disparador, resuelve el tema y te muestra la carga útil, sin activar nada. Elimina dryRun para activarlo de verdad. También puedes pasar {"fromHistoryId":"456"} para reactivar un evento anterior en lugar de crear uno nuevo.
Los desencadenantes que funcionan mediante sondeo, en lugar de mediante un webhook, no se pueden simular; aparecen como simulatable: false en la lista de desencadenantes.
Claves de API
Crea una clave en la página «Desarrollador» y selecciona su nivel de acceso:
- Solo lectura: ver los desencadenantes y su estado, consultar el historial de eventos, las estadísticas y los permisos.
- Leer y escribir, así como activar y desactivar los disparadores.
- Leer, escribir y ejecutar; además, simular disparadores y probar código de disparadores personalizado.
La clave completa se muestra una sola vez, en el momento de su creación. Las claves se almacenan en forma de hash y pueden revocarse en cualquier momento. Envíala como un token «Bearer»:
Authorization: Bearer ftk_your_key_here
La simulación se sitúa por debajo de su propio nivel por la razón mencionada anteriormente: ejecuta las automatizaciones de verdad, por lo que una clave utilizada para las lecturas cotidianas no puede activarlas.

API REST
| Método | Ruta | Nivel | Objetivo |
|---|---|---|---|
| OBTENER | /api/v1 |
ninguno | Índice de la API: confirma que la API está operativa |
| OBTENER | /api/v1/me |
leer | Comprueba la autenticación y consulta el nivel de tu clave |
| OBTENER | /api/v1/triggers |
leer | Cada disparador, con su estado para tu tienda |
| OBTENER | /api/v1/triggers/:handle |
leer | Un desencadenante en detalle |
| PUT | /api/v1/triggers/:handle |
escribir | Activar o desactivar un disparador |
| PUT | /api/v1/triggers |
escribir | Activar o desactivar varios elementos en una sola llamada |
| PUBLICAR | /api/v1/triggers/:handle/simulate |
ejecutar | Simular un disparador |
| OBTENER | /api/v1/triggers/custom |
leer | Tus propios desencadenantes personalizados, con su código |
| OBTENER | /api/v1/triggers/custom/:handle/test |
leer | El evento de muestra capturada para un disparador personalizado |
| PUBLICAR | /api/v1/triggers/custom/:handle/test |
ejecutar | Ejecutar código de activador personalizado sin guardar ni activar |
| OBTENER | /api/v1/history |
leer | Enumerar eventos desencadenantes |
| OBTENER | /api/v1/history/:id |
leer | Obtener un evento, con su carga útil |
| OBTENER | /api/v1/stats |
leer | Totales, tasa de éxito, desglose por estado |
| OBTENER | /api/v1/permissions |
leer | Qué permisos de datos has concedido y qué funciones desbloquea cada uno de ellos |
GET /api/v1/triggers Es muy útil para la configuración: para cada activador, te indica qué permiso necesita, si se le ha concedido ese permiso, si el activador está activado y en qué parte de la aplicación se puede gestionar.
Activar y desactivar los disparadores
PUT Se utiliza esto en lugar de PATCH porque la llamada es idempotente: volver a ejecutarla tras un tiempo de espera no puede provocar que se aplique nada por duplicado, lo cual es importante cuando un asistente controla la API.
curl -X PUT https://shopify.workflow-trigger-extensions.app/api/v1/triggers/order-tags-added-trigger \
-H "Authorization: Bearer ftk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"enabled":true}'La función «Enable» nunca concede ningún permiso. Si el disparador necesita un permiso que tú no has concedido, la llamada se ejecuta con éxito y te indica exactamente qué falta y dónde debes concederlo:
{
"enabled": true,
"scopeGranted": false,
"missingScopeLabels": ["Order Data Access"],
"permissionsUrl": "https://admin.shopify.com/store/.../app/permissions?permission=read_orders",
"warning": "Enabled, but this trigger cannot fire until Order Data Access is granted."
}
Ese enlace abre la página «Permisos» y se desplaza directamente hasta la ficha que necesitas.
Añade "sync": true para que también se inicie una sincronización de datos, de modo que el disparador actúe sobre los registros que ya existen y no solo sobre los que se creen a partir de ahora.
Para cambiar varias opciones a la vez, PUT /api/v1/triggers admite una lista explícita o una categoría completa:
{ "enabled": true, "handles": ["order-tags-added-trigger", "order-note-changed-trigger"] }
{ "enabled": true, "category": "orders" }
Conectar GitHub
En la página «Desarrollador», la pestaña «Conexiones» te permite conectar un repositorio de GitHub para tu código de Desencadenantes personalizados. Los cambios se pueden revisar en una solicitud de incorporación de cambios, puedes ver quién ha modificado qué y puedes revertir una transformación que haya dejado de funcionar.
Al hacer clic en «Conectar», se instala nuestra aplicación de GitHub en la cuenta que elijas. Tú decides a qué repositorios puede acceder y puedes revocar ese acceso desde GitHub en cualquier momento. Al seleccionar un repositorio, se guardan en él inmediatamente todos los desencadenantes personalizados que ya tengas, de modo que la aplicación se adapta desde el principio, en lugar de ir completándose con el tiempo.
| A qué te dedicas | ¿Qué ocurre? |
|---|---|
| Crear, editar o duplicar un activador en la aplicación | El archivo se ha guardado en tu repositorio. |
| Eliminar un activador de la aplicación | El archivo se ha eliminado de tu repositorio |
| Enviar una modificación a la rama conectada | El código del disparador se actualiza en la aplicación |
Cada disparador es un archivo cuyo nombre coincide con su identificador y que contiene exactamente el módulo que ves en el editor, sin nada más a su alrededor. Así que puedes abrirlo en tu propio editor, ejecutarlo y comprobar su sintaxis como cualquier otro archivo JavaScript; después, utiliza el punto final /test indicado anteriormente para ejecutarlo con un evento real capturado antes de confirmar los cambios.
Volver a una versión anterior
No es necesario saber utilizar Git para deshacer un cambio. Una vez conectado el repositorio, el editor de disparadores muestra un menú desplegable «Versión» en el que aparecen todas las versiones anteriores de ese archivo, junto con su fecha y autor. Elige una y se cargará en el editor como un cambio sin guardar, para que puedas leerla primero; al guardarla, se restablecerá como una nueva confirmación.
Cambiar o desconectar
La opción «Cambiar repositorio» te lleva de vuelta al selector sin modificar la instalación. «Desconectar» revoca la instalación en GitHub y la elimina también aquí, tal y como indica su nombre. «Gestionar permisos» abre la configuración de la instalación en GitHub, donde puedes añadir o eliminar repositorios.
Prueba del código de un disparador personalizado
Si guardas el código de tu activador personalizado en un repositorio y lo editas en tu propio editor, puedes ejecutarlo con el evento de muestra capturado sin necesidad de guardarlo primero en la aplicación.
curl -X POST https://shopify.workflow-trigger-extensions.app/api/v1/triggers/custom/my-trigger/test \
-H "Authorization: Bearer ftk_your_key_here" \
-H "Content-Type: application/json" \
-d "$(jq -Rn --rawfile c flow-triggers/my-trigger.js '{code:$c}')"Obtienes lo que muestra el botón «Test» de la aplicación: si se ejecutaría, el objeto de salida, las líneas de ctx.log y el tiempo de ejecución.
No se ejecuta nada ni se guarda nada: no se ejecuta ningún flujo de trabajo, no se registra ningún evento, no se consume ninguna asignación y el código almacenado permanece intacto. Se puede ejecutar con total seguridad cada vez que se guarda desde un observador de archivos. Consulta Desencadenantes personalizados para ver el flujo de trabajo completo.
Servidor MCP
La pestaña «MCP» de la página «Desarrollador» muestra la URL del servidor y un comando de conexión listo para copiar para Claude, Cursor, VS Code, Gemini CLI y otras herramientas. Las herramientas reflejan los puntos finales REST, y el conjunto de herramientas depende del nivel de tu clave: una clave de solo lectura no tiene acceso en absoluto a las herramientas de escritura ni de ejecución.
| Herramienta | Nivel | Para qué sirve |
|---|---|---|
list_triggers |
leer | Cada disparador y su estado |
list_custom_triggers |
leer | Tus propios desencadenantes personalizados, con su código |
get_custom_trigger_sample |
leer | El evento capturado con el que se compara un disparador personalizado |
list_history |
leer | Acontecimientos desencadenantes recientes |
get_event |
leer | Un evento, incluida su carga útil |
get_stats |
leer | Estadísticas agregadas |
get_permissions |
leer | Permisos concedidos y lo que permiten hacer |
get_trigger |
escribir | Un desencadenante en detalle |
set_trigger |
escribir | Activar o desactivar un disparador |
set_triggers_bulk |
escribir | Encender o apagar varios a la vez |
simulate_trigger |
ejecutar | Activar un disparador cuando se desee |
test_custom_trigger |
ejecutar | Ejecutar código de activación personalizado sin guardar ni activar |
Esto es lo que hace que un asistente sea realmente útil: puede enumerar lo que hay, explicar qué necesita un disparador, activarlo, ejecutar un evento de prueba, leer el resultado y, en el caso de los disparadores personalizados, reescribir el código y probarlo, todo ello sin que tengas que salir de la conversación.
Cómo se protegen tus datos
Las cargas útiles de los eventos se devuelven con los datos personales enmascarados: las direcciones de correo electrónico, los números de teléfono, los números de tarjeta y los campos con nombres de personas se sustituyen por ***. Shopify Los identificadores de recursos y los campos relacionados con la empresa se mantienen intactos para que la carga útil siga siendo útil.
El enmascaramiento se aplica a los nombres de los campos y a los patrones de valores, por lo que es una medida de precaución, pero no ofrece garantías: los datos personales contenidos en un campo de texto libre podrían seguir apareciendo. Además, a los mensajes de error se les eliminan los detalles de diagnóstico internos antes de que salgan del servidor.
La conexión con GitHub no almacena ninguna credencial que pueda filtrarse: solo se conserva el identificador de instalación, y el acceso al repositorio utiliza un token generado en el momento que caduca en menos de una hora.
Próximos pasos
- Desencadenantes personalizados - Crea tu propio disparador con unas pocas líneas de JavaScript.
- Planes y uso - qué se considera un suceso y cómo funciona la prestación.
- Introducción a «Workflow Trigger Extensions» - cómo funcionan los disparadores y cómo activarlos.
Límites de frecuencia
La API REST y el servidor MCP comparten un mismo presupuesto por clave de API.
- 300 solicitudes cada 60 segundos por clave, en una ventana fija.
- Las llamadas de nivel de ejecución cuentan con un segundo presupuesto más ajustado de 60 por hora. Se consumen ambos, por lo que una ráfaga de ejecuciones también merma la asignación compartida. En el caso de esta aplicación, eso significa simular un desencadenador y ejecutar código de desencadenador personalizado, dos acciones que realmente activan tus flujos de trabajo.
- Es igual en todos los planes. Los contadores de tu plan activan eventos, no llamadas a la API, por lo que la actualización no hace que estas cifras aumenten.
- Se devuelve el código HTTP 429. Espera un rato y vuelve a intentarlo, a ser posible con un retardo exponencial.
- Si nuestra caché no está disponible durante un breve periodo de tiempo, el limitador se desactiva en lugar de bloquear tu integración.
Los webhooks entrantes de Shopify no están sujetos a límites de frecuencia
No limitamos el número de webhooks que nos envía Shopify: se aceptan tal y como llegan y se ponen en cola. El límite máximo es el número de eventos permitidos en tu plan durante 30 días.
Hay algo que conviene saber si escribes disparadores personalizados: tu código se ejecuta cada vez que se produce un evento del tema al que está atento, y cada ejecución cuenta como un evento, incluidos aquellos que filtras devolviendo null. El coste es el mismo que el del disparador integrado para ese mismo evento.
Shopify
Se trata de los límites que impone Shopify a las API de Shopify, no los nuestros. Se aplican a lo que esta aplicación (y tus flujos de trabajo) pueden hacer en el lado de Shopify, y es posible que los alcances en una tienda grande, incluso aunque te mantengas bien por debajo de nuestros límites.
- Los matrices de entrada tienen un límite de 250 elementos en todas las API de Shopify. Se rechaza cualquier solicitud que contenga una matriz con más elementos.
- La paginación se detiene a los 25 000 objetos. Los recuentos son precisos hasta 25 000; por encima de esa cifra, Shopify devuelve
25001, lo que significa «más de 25 000». Si necesitas ir más allá, aplica primero un filtro. - El uso de la API de administración de GraphQL se mide en función del coste calculado de las consultas, en puntos por segundo, y el límite máximo depende del plan de Shopify de la tienda:
| Shopify plan | Puntos por segundo |
|---|---|
| Estándar | 100 |
| Avanzado | 200 |
| Además | 1000 |
| Enterprise (Componentes de comercio) | 2000 |
La API de Storefront no tiene límite de solicitudes.
Más información: Límites de rate de la API de Shopify

