Skip to main content
Flowker llama a servicios externos (como motores anti-fraude, procesadores de pago y providers KYC) a través de configuraciones de provider. Una configuración de provider es tu conexión a una instancia activa de un servicio externo. En esta guía, explorarás el catálogo, crearás una configuración de provider, la referenciarás desde un node de workflow, mapearás campos entre tus datos y el servicio, y entenderás cómo Flowker reintenta y protege esas llamadas.
El catálogo es un registro de solo lectura de los providers, executors del catálogo y triggers que vienen con Flowker. Los descubres; nunca los creas.
1

Listar providers disponibles

Llama al endpoint Listar providers del catálogo para ver los tipos de servicio a los que Flowker se conecta. El catálogo siempre incluye el conector HTTP genérico. Los proveedores nativos, como ledger (Midaz) y tracer, se generan a partir de especificaciones OpenAPI publicadas y aparecen solo cuando el registro de esquemas nativos está configurado y la generación se completa correctamente.
2

Listar executors del catálogo disponibles

Llama al endpoint Listar executors del catálogo para ver las operaciones que un node de workflow puede invocar. Usa Listar executors por provider para acotar la lista a un solo provider.
3

Listar triggers disponibles

Llama al endpoint Listar triggers del catálogo para ver los tipos de trigger integrados: webhooks y schedules. La API de ejecutar un workflow inicia un workflow, pero no es un trigger del catálogo.
4

Elige lo que necesitas

Anota el providerId y el id del executor del catálogo que coinciden con tu integración. Usas el primero en el Paso 2 y el segundo en el Paso 3.
Piensa en el catálogo como un menú: muestra a qué puede llamar Flowker. Las configuraciones de provider son tus pedidos específicos — la URL base, las credenciales y los ajustes para cada instancia de servicio que usas.

Paso 2: Crear una configuración de provider


Llama a POST /v1/provider-configurations para definir tu conexión a una instancia de un servicio externo.
Un providerId es un identificador del catálogo, y no siempre coincide con el nombre del producto. Midaz está registrado como ledger. Toma siempre el valor de Listar providers del catálogo en lugar de deducirlo del nombre del producto.
El providerId de la configuración y el executorId del node que la usa deben pertenecer al mismo provider del catálogo. El conector HTTP genérico usa http en ambos. Un workflow que combina una configuración de un provider con un executor de otro se rechaza con FLK-0151.
El ejemplo de abajo construye la conexión que esta guía usa de aquí en adelante: un servicio de puntuación de fraude alcanzado por el conector HTTP genérico.
La respuesta devuelve el id de la nueva configuración. Guárdalo — el Paso 3 y el Paso 4 lo ponen en el providerConfigId del node que llama al servicio.

Autenticación

El bloque config.auth contiene la autenticación que el servicio externo exige, como un par { type, config }. Usa el método que tu servicio espera. Los campos secretos de config.auth se almacenan fuera del documento de configuración persistido. Una lectura autorizada de la configuración del proveedor puede resolver esos valores desde el vault y devolverlos sin máscara; los campos que no se resuelven permanecen enmascarados. Otorga el acceso de lectura en consecuencia. Cualquier otra cosa que pongas en el documento de configuración — un header, por ejemplo — se almacena junto con la configuración, y una lectura puede devolverla. Pon cada credencial en config.auth. Para rotar un secreto, envía el nuevo valor en una actualización. Para conservar el actual, omite el campo o envíalo en blanco: esto funciona mientras auth.type no cambie. Una actualización que cambia auth.type debe llevar un valor para cada secreto que el nuevo tipo exige y el anterior no exigía; si falta, Flowker la rechaza con FLK-0952. Un cambio entre dos tipos que usan el mismo secreto, como de oidc_user a oidc_client_credentials, no necesita ese valor otra vez.
Para integraciones OAuth 2.0, usa oidc_client_credentials. Flowker gestiona la obtención y renovación de tokens automáticamente.

Habilitar y deshabilitar

Las configuraciones de provider tienen dos estados: active (en uso) y disabled (temporalmente offline). Se crean con estado active. Usa Deshabilitar configuración de provider para sacar una conexión de servicio y Habilitar configuración de provider para devolverla. Consulta la API de Configuraciones de provider para la referencia completa.

Paso 3: Referenciar la configuración de provider desde un node de workflow


Cada node executor lleva un providerConfigId — el identificador de la configuración de provider a través de la cual llama. Flowker rechaza un workflow cuyo node executor no tiene providerConfigId, y rechaza un valor que no sea un UUID. En tiempo de ejecución, construye cada solicitud saliente con la URL base de esa configuración de provider más el path del node, y el node falla si la configuración de provider no está active. Estos son los campos que un node executor define en su objeto data cuando llama a través del conector HTTP genérico: Un node que llama a una operación de un documento OpenAPI subido la nombra con operation_path y operation_method en lugar de un executorId. Flowker rellena el executorId por ti a partir de la configuración de provider a la que apunta el node. Conectar tu propia API recorre todo ese camino.

Validar la configuración de un node antes de guardarlo

Llama al endpoint Validar una configuración de node (POST /v1/catalog/executors/{id}/validate) para comprobar la configuración de un node contra el JSON Schema del executor del catálogo. Esto ejecuta solo la validación de JSON Schema — verifica que tu objeto de configuración corresponde a la estructura que el executor del catálogo espera (campos obligatorios, tipos, formatos). No llama al servicio externo, así que la primera ida y vuelta real ocurre cuando un workflow ejecuta el node. Pasa mappedTargets para nombrar los campos que tu node aporta mediante un inputMapping en lugar de un valor fijo. Esos campos cuentan como satisfechos, así que un node que mapea un campo obligatorio desde el trigger valida antes de guardarlo.

Mapeo de campos y transformación de datos


Cuando los datos del workflow no coinciden con el formato que espera un servicio externo — o cuando un servicio devuelve datos en una forma que el siguiente paso no puede consumir — usa mapeos de campos y transformaciones para cubrir esa brecha. Los mapeos de campos y transformaciones se definen dentro del objeto data de los nodes executor. Flowker aplica los mapeos de entrada antes de llamar al servicio externo, y los mapeos de salida después de recibir la respuesta. Un target de entrada es una ruta en el cuerpo de la solicitud saliente, escrita exactamente como el servicio externo la espera: no hay objeto envoltorio ni prefijo que añadir. Un source de salida es una ruta dentro del envelope de respuesta, así que los campos de la respuesta quedan bajo body.
Los nodes siguientes leen la salida mapeada bajo el ID de este node: ${executor-balance.balance}.
Para integraciones complejas, también puedes adjuntar transformaciones a entradas individuales de mapeo (por ejemplo, quitar caracteres, añadir prefijos, cambiar el case) y definir operaciones Kazaam para transformaciones avanzadas de JSON a JSON. Trabajar con los datos de la solicitud y de la respuesta recorre todo el camino: declarar los mapeos, elegir qué arma el cuerpo de la solicitud, ajustar los valores en tránsito, leer la respuesta de vuelta y revisar la solicitud armada antes de llamar al servicio.

Paso 4: Ejecutar el workflow


Referencia la configuración de provider en un node de workflow de tipo executor. El ejemplo a continuación crea un workflow de validación de pagos sobre la conexión FraudShield del Paso 2. Cuando llega un pago, Flowker llama al servicio de verificación de fraude, evalúa el score de riesgo y aprueba o rechaza el pago según el resultado. El workflow tiene cinco nodes: un trigger webhook que recibe el pago, un node executor que llama al servicio de verificación de fraude, un node conditional que evalúa el score, y dos nodes action para los resultados de aprobación y rechazo. Los edges los conectan en secuencia, con el node condicional bifurcando hacia uno u otro camino según el umbral del score. Usa el endpoint Crear workflow para definir el workflow, luego Actívalo y finalmente Ejecútalo.
El node check-fraud nombra http — el conector HTTP genérico del catálogo — y la configuración FraudShield creada en el Paso 2, que contiene la URL base y las credenciales. Ambos lados nombran el mismo provider, así que el workflow se guarda. Flowker envía la solicitud a https://api.fraudshield.example.com/score-transaction.El node no declara ningún outputMapping, así que su salida conserva la forma del envelope de respuesta. Por eso el score está en check-fraud.body.score, que es lo que lee la condición de evaluate-score. Añade un outputMapping cuando prefieras un nombre más plano — consulta Mapeo de campos y transformación de datos.

Disparar workflows


Las ejecuciones de workflows se disparan a través del endpoint Ejecutar workflow:
El cuerpo de la solicitud contiene el inputData de la ejecución. Todos los campos están disponibles para los nodes siguientes a través del namespace workflow — por ejemplo, workflow.transactionId o workflow.amount. Las salidas de los nodes están disponibles a través del ID del node — por ejemplo, check-fraud.body.score para un node que no declara ningún outputMapping.

Idempotencia

Cada solicitud de ejecución debe incluir un header Idempotency-Key. Las solicitudes sin él se rechazan con 400 Bad Request (error FLK-0509). Genera un UUID nuevo para cada ejecución, y reutiliza la misma clave solo cuando reintentes la solicitud idéntica.

Triggers de webhook


Los webhooks son la forma principal en que los sistemas externos disparan workflows de Flowker. En lugar de que tu sistema llame directamente a la API de ejecuciones, registras un path de webhook en un workflow y los servicios externos envían solicitudes HTTP a ese path.

Cómo funciona

  1. Agrega un node trigger de tipo webhook a tu workflow con un path, un method y un input_contract en su data.
  2. Cuando el workflow se activa, Flowker registra el path en su registro de webhooks.
  3. Los sistemas externos envían solicitudes a POST /v1/webhooks/{path} (o el método que configuraste).
  4. Flowker resuelve el path al workflow correspondiente y lo ejecuta.

Definir un node trigger de webhook

El trigger de webhook es un node con type: "trigger" y triggerType: "webhook" en su data, más un path, un method y un input_contract. Configurar un trigger de webhook cubre cada campo, los tres modos de input_contract y lo que exige cada uno, y trae un node de ejemplo para cada modo. La configuración del trigger es un contrato cerrado. Guardar un workflow cuyo trigger de webhook omite path, method o input_contract, olvida un campo que su modo input_contract exige, nombra el id de esquema o un campo de operación de otro modo, o lleva una clave o un valor que el esquema no acepta falla con FLK-0934. El esquema también declara los campos opcionales response_mode y response_view — consulta Modo de respuesta síncrona.

Proteger un webhook

La entrega de webhooks usa la misma autenticación que el resto de la API. Con Access Manager habilitado (PLUGIN_AUTH_ENABLED=true), cada solicitud a /v1/webhooks/* debe llevar un token Bearer (JWT OIDC), y quien llama debe tener el permiso execute sobre el recurso webhooks. Las solicitudes sin un token válido se rechazan con 401 Unauthorized. Otorga ese permiso a una identidad máquina-a-máquina para cada sistema al que permitas llamar a tus webhooks, y gestiona la concesión en Access Manager. Esto mantiene el acceso a webhooks bajo el mismo modelo de roles y políticas que la gestión de workflows, en lugar de una credencial adjunta al path.

Metadatos del webhook

Flowker inyecta automáticamente un objeto _webhook en el inputData de la ejecución con metadatos sobre la solicitud entrante: Estos metadatos están disponibles para todos los nodes del workflow a través del namespace workflow._webhook.

Notas importantes

  • Cada combinación de path + método de webhook solo puede ser registrada por un workflow activo. Activar un segundo workflow con el mismo path falla con un error de conflicto.
  • Los paths de webhook admiten segmentos anidados (p. ej., payments/stripe/received).
  • El tamaño máximo del cuerpo de la solicitud es 1 MB.
  • Desactivar un workflow desregistra automáticamente sus rutas de webhook.
Consulta la referencia de API Disparar un webhook para la documentación completa del endpoint.

Modo de respuesta síncrona

Por defecto, un trigger de webhook responde con un recibo 202 en cuanto la ejecución arranca (el modo async) — quien llama debe consultar el estado de la ejecución por separado. Define response_mode como "sync" en el data del node trigger para que Flowker mantenga la conexión HTTP abierta y devuelva el resultado de la ejecución directamente en la respuesta: Si la ejecución no alcanza un estado terminal antes de que expire el límite interno de espera, Flowker recae en el mismo recibo 202 (con un header Location apuntando al endpoint de resultados) que habría devuelto el modo async. response_view selecciona la forma del cuerpo de la respuesta sync: El finalOutput de una ejecución fallida (en las vistas full o final_output) lleva siempre status: "failed" y errorMessage, y errorClass cuando Flowker pudo clasificar el fallo — nunca un {} vacío. Sin un override responseStatusCode (ver abajo), el estado HTTP sync se mantiene en 200 para full/final_output/receipt (informa de la salud del transporte, no del resultado de negocio). Un responseStatusCode válido en el node set_output terminal sobrescribe ese estado para esas tres vistas. Un node action con actionType: "set_output" puede llevar un responseStatusCode opcional (entero, 200599) para sobrescribir el estado HTTP que devuelve una respuesta de webhook sync. Un valor fuera de rango o no entero se rechaza al guardar (FLK-0122). Para passthrough, el override se aplica solo cuando el propio node set_output es el paso terminal — el estado retransmitido de un executor terminal siempre gana, y el fallback sin respuesta siempre usa un 200 simple para que un override nunca enmascare un fallo. La detección de passthrough es estricta: solo cuenta el paso terminal. Un set_output terminal después de un executor toma la forma de su propia salida — Flowker nunca retrocede a la respuesta de un executor anterior. En una ejecución fallida, el paso que detiene el flujo es el paso terminal, así que un 4xx del provider que detuvo el workflow se retransmite como el 4xx real. Los valores en la salida de un node set_output admiten referencias ${...} resueltas contra el contexto del workflow — incluyendo ${workflow.<campo>} (payload del trigger), ${execution.id}, ${execution.startedAt} y ${execution.now} (marcado en el momento de la interpolación). Una referencia ${...} que no se pueda resolver hace fallar el paso (fail-closed).

Manejo de errores


Si un node falla, la ejecución se detiene y se marca como failed. No hay fallback automático. Después de agotar los reintentos, la ejecución falla. Los resultados de ejecución informan el status de la ejecución y stepResults. Un paso fallido proporciona stepNumber, nodeId, status y errorMessage, con statusCode y errorClass cuando están disponibles; output es opcional. No garantices un errorCode, incluidos FLK-0504 o FLK-0507, en cada payload de resultados de ejecución.

Reintentos y circuit breaker


Flowker incluye resiliencia integrada para las llamadas de executor.

Reintentos

Cuando una llamada de executor falla con un error transitorio — un error de red, un timeout en el intento, cualquier estado 5xx, o los estados 408 o 429 — Flowker reintenta automáticamente. El comportamiento de reintento se configura por node, en el data del node executor: Los reintentos solo aplican cuando la operación es segura de repetir. Por defecto, las llamadas POST y PATCH se tratan como no idempotentes y no se reintentan (un solo intento), mientras que GET, PUT, DELETE y otros verbos reintentan normalmente. Un retry.max_attempts mayor que 1 activa los reintentos en ese node sea cual sea el método. Un retry.max_attempts de 1 no es una activación — define un solo intento. Los errores no reintentables se reducen a un solo intento sin importar la configuración: circuit breaker abierto, contexto cancelado, errores de configuración, fallos al resolver secretos, un cuerpo de solicitud por encima del tope de tamaño configurado, un cuerpo de respuesta del provider por encima del mismo tope, y respuestas 4xx no transitorias del provider (cualquier 4xx excepto 408 y 429). El reintento aplica por ejecución de node. Si todos los intentos fallan, el paso se marca como fallido y la ejecución se detiene.

Circuit breaker

Flowker usa un circuit breaker para proteger a los servicios externos de ser saturados por llamadas fallidas repetidas: Los errores 4xx de cliente/autenticación del provider no abren el circuito: son problema de quien llama, no una señal de que el provider esté caído. Solo los fallos de transporte y los 5xx cuentan para el umbral. Cuando el circuito está abierto, las llamadas de executor fallan de inmediato con FLK-0507 en lugar de alcanzar el servicio externo. Esto evita fallos en cascada y da tiempo al servicio externo para recuperarse.
Estados del circuit breaker

Transiciones de estado del circuit breaker

El circuito comienza en el estado Closed, donde todas las solicitudes pasan normalmente. Al alcanzar el umbral de fallos, transita a Open, bloqueando todas las solicitudes de inmediato. Después de 30 segundos, pasa a Half-Open y permite una solicitud de prueba. Si esa solicitud tiene éxito, el circuito vuelve a Closed. Si falla, el circuito se reabre por otro ciclo de 30 segundos.
El circuit breaker opera por configuración de provider, acotado a tu tenant. Los fallos contra una conexión no afectan a otra, y un tenant no puede abrir el circuito de otro. Los umbrales del circuit breaker (número de fallos, timeout de recuperación) son valores por defecto globales configurados en el despliegue — no se pueden personalizar por conexión en esta versión.

Registro de configuraciones de executor


Flowker mantiene un registro de configuraciones de executor. El registro expone cuatro operaciones: Cada registro lleva un status, que la API informa en cada respuesta: PATCH acepta name, baseUrl, endpoints y authentication, más los opcionales description y metadata. No acepta status, pero la operación de listado acepta status como filtro de consulta. La actualización aplica a registros en estado unconfigured o configured; la eliminación aplica a registros en estado unconfigured, configured o disabled. Ninguna operación en esta versión mueve un registro a tested, active o disabled; la tabla lista esos valores porque las respuestas los informan y el filtro de listado los acepta.

Qué sigue


Conceptos fundamentales

Comprende workflows, nodes, edges y ejecuciones.

API de Configuraciones de provider

Explora la API de configuraciones de provider.