Skip to main content
Flowker llama a servicios externos (como motores de fraude, procesadores de pago y proveedores de KYC) a través de configuraciones de proveedor. Una configuración de proveedor es tu conexión a una instancia activa de un servicio externo. En esta guía exploras el catálogo, creas una configuración de proveedor y la referencias desde un nodo de workflow. Después mapeas campos entre tus datos y el servicio, y aprendes cómo Flowker reintenta y protege esas llamadas.

Paso 1: Explora el catálogo


El catálogo es un registro de solo lectura de los proveedores, los ejecutores del catálogo y los disparadores que vienen con Flowker. Los descubres. Nunca los creas.
1

Lista los proveedores disponibles

Llama al endpoint Listar proveedores del catálogo para ver los tipos de servicio a los que se conecta Flowker. El catálogo siempre incluye el conector HTTP genérico. Los proveedores nativos como ledger (Midaz) y tracer se sintetizan a partir de especificaciones de OpenAPI publicadas y aparecen solo cuando el registro de esquemas nativos está configurado y la síntesis tiene éxito.
2

Lista los ejecutores del catálogo disponibles

Llama al endpoint Listar ejecutores del catálogo para ver las operaciones que un nodo de workflow puede invocar. Usa Listar ejecutores por proveedor para acotar la lista a un proveedor.
3

Lista los disparadores disponibles

Llama al endpoint Listar disparadores del catálogo para ver los tipos de disparador integrados: webhooks y programaciones. La API de ejecución de workflow inicia un workflow pero no es un disparador del catálogo.
4

Elige lo que necesitas

Anota el providerId y el id del ejecutor del catálogo que corresponden a 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 lo que Flowker puede llamar. Las configuraciones de proveedor son tus pedidos específicos: la URL base, las credenciales y los ajustes de cada instancia de servicio que usas.

Paso 2: Crea una configuración de proveedor


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. El catálogo registra Midaz como ledger. Toma siempre el valor de Listar proveedores del catálogo en lugar de adivinarlo a partir del nombre del producto.
El providerId de la configuración y el executorId del nodo que la usa deben pertenecer al mismo proveedor del catálogo. El conector HTTP genérico usa http para ambos. Flowker rechaza un workflow que empareja una configuración de un proveedor con un ejecutor de otro, 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 al que se llega a través del 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 nodo que llama al servicio.

Autenticación

El bloque config.auth contiene la autenticación que requiere el servicio externo, como un par { type, config }. Usa el método que espera tu servicio. Flowker almacena las hojas secretas de config.auth fuera del documento de configuración persistido. Una lectura autorizada de la configuración de proveedor puede resolver esos valores desde el vault y devolverlos en claro. Las hojas sin resolver permanecen enmascaradas. Otorga el acceso de lectura en consecuencia. Cualquier otra cosa que coloques en el documento de configuración (un header, por ejemplo) permanece con la configuración, y una lectura puede devolverla. Coloca 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 vacío. Esto funciona mientras auth.type siga siendo el mismo. Una actualización que cambia auth.type debe llevar un valor para cada secreto que el nuevo tipo requiere y el anterior no. De lo contrario 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 de nuevo.
Para integraciones de OAuth 2.0, usa oidc_client_credentials. Flowker gestiona la obtención y la renovación del token automáticamente.

Habilitar y deshabilitar

Las configuraciones de proveedor tienen dos estados: active (en uso) y disabled (temporalmente fuera de línea). Una nueva configuración de proveedor empieza en estado active. Usa Deshabilitar una configuración de proveedor para sacar una conexión de servicio y Habilitar una configuración de proveedor para devolverla. Consulta la API de configuraciones de proveedor para la referencia completa.

Paso 3: Referencia la configuración de proveedor desde un nodo de workflow


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

Valida la configuración de un nodo antes de guardar

Llama al endpoint Validar la configuración de un nodo (POST /v1/catalog/executors/{id}/validate) para verificar la configuración de un nodo contra el JSON Schema del ejecutor del catálogo. Esto hace solo validación de JSON Schema. Verifica que tu objeto de configuración coincida con la estructura que espera el ejecutor del catálogo (campos obligatorios, tipos, formatos). No llama al servicio externo, así que el primer viaje de ida y vuelta real ocurre cuando un workflow ejecuta el nodo. Pasa mappedTargets para nombrar los campos que tu nodo suministra a través de un inputMapping en lugar de un valor fijo. Esos campos cuentan como satisfechos, así que un nodo que mapea un campo obligatorio desde el disparador se valida antes de que lo guardes.

Mapeo de campos y transformación de datos


Usa los mapeos de campos y las transformaciones cuando los datos del workflow no coinciden con el formato que espera un servicio externo. Úsalos también cuando un servicio devuelve datos con una forma que el siguiente paso no puede consumir. Defines los mapeos de campos y las transformaciones dentro del objeto data de los nodos ejecutores. 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 la espera el servicio externo. No hay objeto envoltorio ni prefijo que agregar. Un source de salida es una ruta dentro del envelope de la respuesta, así que los campos de la respuesta quedan bajo body.
Los nodos downstream leen la salida mapeada bajo el ID de este nodo: ${executor-balance.balance}.
Para integraciones complejas, también puedes adjuntar transformaciones a entradas de mapeo individuales (por ejemplo, quitar caracteres, agregar prefijos, cambiar mayúsculas y minúsculas). Puedes definir operaciones de Kazaam para transformaciones avanzadas de JSON a JSON. Trabajar con datos de solicitud y respuesta recorre todo el camino. Cubre cómo declarar los mapeos, cómo elegir qué construye el cuerpo de la solicitud y cómo reestructurar valores en vuelo. También cubre cómo leer la respuesta de vuelta, y cómo verificar la solicitud ensamblada antes de llamar al servicio.

Paso 4: Ejecuta el workflow


Referencia la configuración de proveedor en un nodo de workflow de tipo executor. El ejemplo de abajo 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 la puntuación de riesgo y aprueba o rechaza el pago según el resultado. El workflow tiene cinco nodos. Un disparador de webhook recibe el pago, y un nodo ejecutor llama al servicio de verificación de fraude. Un nodo condicional evalúa la puntuación, y hay dos nodos de acción para los resultados de aprobación y rechazo. Las aristas los conectan en secuencia, y el nodo condicional se ramifica hacia cualquiera de los dos caminos según el umbral de la puntuación. Usa el endpoint Crear workflow para definir el workflow, luego Actívalo y por último Ejecútalo.
El nodo check-fraud nombra http, el conector HTTP genérico del catálogo. También nombra la configuración FraudShield del Paso 2, que contiene la URL base y las credenciales. Ambos lados nombran al mismo proveedor, así que el workflow se guarda. Flowker envía la solicitud a https://api.fraudshield.example.com/score-transaction.El nodo no declara outputMapping, así que su salida conserva la forma del envelope de la respuesta. Por eso la puntuación queda en check-fraud.body.score, que es lo que lee la condición evaluate-score. Agrega un outputMapping cuando prefieras un nombre más plano. Consulta Mapeo de campos y transformación de datos.

Disparar workflows


Disparas las ejecuciones de workflow mediante el endpoint Ejecutar workflow:
El cuerpo de la solicitud contiene el inputData de la ejecución. Todos los campos están disponibles para los nodos siguientes mediante el namespace workflow (por ejemplo, workflow.transactionId o workflow.amount). Las salidas de los nodos están disponibles mediante el ID del nodo (por ejemplo, check-fraud.body.score para un nodo que no declara outputMapping).

Idempotencia

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

Disparadores de webhook


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

Cómo funciona

  1. Agrega a tu workflow un nodo disparador de tipo webhook con un path y un method en su data. Establece input_contract de forma explícita en los nodos nuevos cuando necesites validación open, xsd o openapi.
  2. Cuando activas el workflow, 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 nodo disparador de webhook

El disparador de webhook es un nodo con type: "trigger" y triggerType: "webhook" en su data, más un path, un method y un input_contract opcional. Configurar un disparador de webhook cubre cada campo, los tres modos de input_contract y lo que requiere cada uno, y lleva un nodo resuelto para cada modo. La configuración del disparador sigue un contrato cerrado. Guardar un workflow falla con FLK-0934 cuando su disparador de webhook omite path o method, o le falta un campo que requiere el modo de input_contract seleccionado. También falla cuando el disparador nombra el id de esquema o el campo de operación de otro modo. Falla también cuando el disparador lleva una clave o un valor que el esquema no acepta. Una declaración de accepted_headers inválida falla en cambio con FLK-0957. El esquema también declara los campos opcionales response_mode, response_view y accepted_headers. Consulta Configurar un disparador de webhook.

Asegurar 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 de OIDC), y quien llama debe tener el permiso execute sobre el recurso webhooks. Una solicitud sin un token válido falla con 401 Unauthorized. Otorga ese permiso a una identidad máquina a máquina para cada sistema al que dejas llamar a tus webhooks, y gestiona la concesión en Access Manager. Esto mantiene el acceso a los 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 nodos del workflow mediante el namespace workflow._webhook.

Notas importantes

  • Solo un workflow activo puede registrar cada combinación de path + método de webhook. Activar un segundo workflow con el mismo path falla con un error de conflicto.
  • Los paths de webhook admiten segmentos anidados (por ejemplo, payments/stripe/received).
  • El tamaño máximo del cuerpo de la solicitud es 1 MB.
  • Desactivar un workflow da de baja 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íncrono

De forma predeterminada, un disparador de webhook responde con un comprobante 202 en cuanto la ejecución empieza (el modo asíncrono). Quien llama debe consultar el estado de la ejecución por separado. Establece response_mode en "sync" en el data del nodo disparador para que Flowker mantenga abierta la conexión HTTP y devuelva el resultado de la ejecución directamente en la respuesta: Si la ejecución no alcanza un estado terminal antes de que transcurra el límite interno de espera, Flowker recurre al comprobante 202 del modo asíncrono. Ese comprobante lleva un header Location que apunta al endpoint de resultados. response_view selecciona la forma del cuerpo de la respuesta síncrona: El finalOutput de una ejecución fallida (en la vista full o final_output) siempre lleva status: "failed" y errorMessage, y errorClass cuando Flowker pudo clasificar la falla, nunca un {} vacío. Sin una anulación responseStatusCode (ver más abajo), el estado HTTP síncrono se mantiene en 200 para full/final_output/receipt (reporta la salud del transporte, no el resultado de negocio). Un responseStatusCode válido en el nodo set_output terminal anula ese estado para esas tres vistas. Un nodo de acción con actionType: "set_output" puede llevar un responseStatusCode opcional (entero, 200599) para anular el estado HTTP que devuelve una respuesta de webhook sync. Un valor fuera de rango o que no es entero falla al guardar (FLK-0122). Para passthrough, la anulación aplica solo cuando el propio nodo set_output es el paso terminal. El estado del proveedor retransmitido por un ejecutor terminal siempre gana, y el respaldo sin respuesta siempre usa un 200 simple para que una anulación nunca enmascare una falla. La detección de passthrough es estricta: solo cuenta el paso terminal. Un set_output terminal downstream de un ejecutor da forma a la respuesta como su propia salida. Flowker nunca retrocede a la respuesta de un ejecutor anterior. En una ejecución fallida el paso que detiene es el paso terminal, así que Flowker retransmite un 4xx del proveedor que detuvo el workflow como el 4xx real. Los valores de la salida de un nodo set_output admiten referencias ${...} resueltas contra el contexto del workflow, incluidas ${workflow.<field>} (payload del disparador), ${execution.id}, ${execution.startedAt} y ${execution.now} (sellado en el momento de la interpolación). Una referencia ${...} que no se puede resolver hace fallar el paso (fail-closed).

Tratamiento de errores


Si un nodo falla, la ejecución se detiene y su estado pasa a failed. No hay respaldo automático. Después de que se agotan los reintentos, la ejecución falla. Los resultados de la ejecución reportan el status de la ejecución y los stepResults. Un paso fallido proporciona stepNumber, nodeId, status y errorMessage, con statusCode y errorClass cuando están disponibles. El campo output es opcional. No prometas un errorCode, incluidos FLK-0504 o FLK-0507, en cada payload de resultados de ejecución.

Reintento y circuit breaker


Flowker incluye resiliencia integrada para las llamadas de ejecutor.

Reintentos

Cuando una llamada de ejecutor falla con un error transitorio (un error de red, un timeout en el intento, cualquier estado 5xx, o el estado 408 o 429), Flowker reintenta automáticamente. El comportamiento de reintento se configura por nodo, en el data del nodo ejecutor: Los reintentos aplican solo cuando la operación es segura de repetir. De forma predeterminada, Flowker trata las llamadas POST y PATCH como no idempotentes y no las reintenta (un solo intento), mientras que GET, PUT, DELETE y los demás verbos reintentan con normalidad. Un retry.max_attempts mayor que 1 activa los reintentos en ese nodo sea cual sea el método. Un retry.max_attempts de 1 no es una activación. Establece un solo intento. Los errores no reintentables cortocircuitan a un solo intento sin importar la configuración. Son: circuit breaker abierto, contexto cancelado, errores de configuración y fallas de resolución de secretos. También incluyen un cuerpo de solicitud que supera el límite de tamaño configurado, un cuerpo de respuesta del proveedor que supera ese mismo límite y respuestas 4xx no transitorias del proveedor. Eso significa cualquier 4xx salvo 408 y 429. El reintento aplica por ejecución de nodo. Si todos los intentos fallan, el paso falla y la ejecución se detiene.

Circuit breaker

Flowker usa un circuit breaker para que las llamadas fallidas repetidas no saturen los servicios externos: Los errores 4xx de cliente o de autenticación del proveedor no disparan el circuito: son el problema de quien llama, no una señal de que el proveedor está caído. Solo las fallas de nivel de transporte y las 5xx cuentan para el umbral. Cuando el circuito está abierto, las llamadas de ejecutor fallan de inmediato con FLK-0507 en lugar de llegar al servicio externo. Esto evita las fallas en cascada y da tiempo al servicio externo para recuperarse.
Estados del circuit breaker

Transiciones de estado del circuit breaker

El circuito empieza en el estado Closed, donde todas las solicitudes pasan con normalidad. Después de que el circuito alcanza el umbral de fallas, transita a Open y bloquea 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 vuelve a abrir por otro ciclo de 30 segundos.
El circuit breaker opera por configuración de proveedor, acotado a tu tenant. Las fallas contra una conexión no afectan a otra, y un tenant no puede abrir el circuito de otro. Los umbrales del circuit breaker (cantidad de fallas, timeout de recuperación) son valores predeterminados globales del despliegue. No puedes personalizarlos por conexión en esta versión.

Registro de configuraciones de ejecutor


Este registro es un tercer uso, separado, de la palabra “executor”. Sus entradas no son los ejecutores del catálogo del Paso 1. No son los nodos de workflow de type: "executor", ni las configuraciones de proveedor del Paso 2. El motor lee las configuraciones de proveedor para llamar a servicios externos, no estas entradas, y el registro lleva su propio vocabulario de campos (baseUrl, endpoints, authentication). El registro expone cuatro operaciones: Cada entrada lleva un status, que la API reporta 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 query. La actualización aplica a las entradas en estado unconfigured o configured. La eliminación aplica a las entradas en estado unconfigured, configured o disabled. Ninguna operación de esta versión mueve una entrada a tested, active o disabled. La tabla lista esos valores porque las respuestas los reportan y el filtro de listado los acepta.

Qué sigue


Conceptos centrales

Entiende los workflows, los nodos, las aristas y las ejecuciones.

API de configuraciones de proveedor

Explora la API de configuración de proveedor.