Passo 1: Explorar o catálogo
O catálogo é um registro somente leitura dos providers, executors do catálogo e triggers que vêm com o Flowker. Você os descobre; você nunca os cria.
1
Listar providers disponíveis
Chame o endpoint Listar providers do catálogo para ver os tipos de serviço aos quais o Flowker se conecta. O catálogo sempre inclui o conector HTTP genérico. Provedores nativos, como
ledger (Midaz) e tracer, são sintetizados a partir de especificações OpenAPI publicadas e aparecem somente quando o registro de schemas nativos está configurado e a síntese é bem-sucedida.2
Listar executors do catálogo disponíveis
Chame o endpoint Listar executors do catálogo para ver as operações que um node de workflow pode invocar. Use Listar executors por provider para restringir a lista a um único provider.
3
Listar triggers disponíveis
Chame o endpoint Listar triggers do catálogo para ver os tipos de trigger integrados: webhooks e schedules. A API de executar um workflow inicia um workflow, mas não é um trigger do catálogo.
Passo 2: Criar uma configuração de provider
Chame
POST /v1/provider-configurations para definir a sua conexão com uma instância de um serviço externo.
Um
providerId é um identificador do catálogo e nem sempre corresponde ao nome do produto. O Midaz está registrado como ledger. Sempre pegue o valor em Listar providers do catálogo em vez de deduzi-lo do nome do produto.Exemplo de requisição
Exemplo de requisição
Autenticação
O blococonfig.auth contém a autenticação que o serviço externo exige, como um par { type, config }. Use o método que o seu serviço espera.
Os campos secretos de
config.auth são armazenados fora do documento de configuração persistido. Uma leitura autorizada da configuração do provedor pode resolver esses valores no vault e devolvê-los sem máscara; os campos não resolvidos permanecem mascarados. Conceda o acesso de leitura de acordo com isso.
Qualquer outra coisa que você colocar no documento de configuração — um header, por exemplo — é armazenada junto com a configuração, e uma leitura pode devolvê-la. Coloque cada credencial em config.auth.
Para rotacionar um segredo, envie o novo valor em uma atualização. Para manter o atual, omita o campo ou envie-o em branco: isso funciona enquanto auth.type não mudar. Uma atualização que muda auth.type deve levar um valor para cada segredo que o novo tipo exige e o anterior não exigia; caso contrário, o Flowker a rejeita com FLK-0952. Uma mudança entre dois tipos que usam o mesmo segredo, como de oidc_user para oidc_client_credentials, não precisa desse valor novamente.
Exemplo — OIDC client credentials
Exemplo — OIDC client credentials
Habilitar e desabilitar
As configurações de provider possuem dois status:active (em uso) e disabled (temporariamente offline). Elas são criadas com status active. Use Desabilitar configuração de provider para tirar uma conexão de serviço e Habilitar configuração de provider para trazê-la de volta.
Consulte a API de Configurações de provider para a referência completa.
Passo 3: Referenciar a configuração de provider a partir de um node de workflow
Todo node executor carrega um
providerConfigId — o identificador da configuração de provider pela qual ele chama. O Flowker rejeita um workflow cujo node executor não tem providerConfigId e rejeita um valor que não seja um UUID. Em tempo de execução, ele monta cada requisição de saída com a URL base dessa configuração de provider mais o path do node, e o node falha se a configuração de provider não estiver active.
Estes são os campos que um node executor define no seu objeto data quando chama através do conector HTTP genérico:
Um node que chama uma operação de um documento OpenAPI enviado a nomeia com
operation_path e operation_method em vez de um executorId. O Flowker preenche o executorId por você a partir da configuração de provider para a qual o node aponta. Conectando a sua própria API percorre todo esse caminho.
Validar a configuração de um node antes de salvar
Chame o endpoint Validar uma configuração de node (POST /v1/catalog/executors/{id}/validate) para conferir a configuração de um node contra o JSON Schema do executor do catálogo.
Isso executa apenas a validação de JSON Schema — verifica se o seu objeto de configuração corresponde à estrutura que o executor do catálogo espera (campos obrigatórios, tipos, formatos). Não chama o serviço externo, então a primeira ida e volta real acontece quando um workflow executa o node.
Passe mappedTargets para nomear os campos que o seu node fornece por um inputMapping em vez de um valor fixo. Esses campos contam como satisfeitos, então um node que mapeia um campo obrigatório vindo do trigger valida antes de você salvá-lo.
Mapeamento de campos e transformação de dados
Quando os dados do workflow não correspondem ao formato esperado por um serviço externo — ou quando um serviço retorna dados em um formato que o próximo passo não consegue consumir — use mapeamentos de campos e transformações para cobrir essa lacuna. Os mapeamentos de campos e transformações são definidos dentro do objeto
data dos nodes executor. O Flowker aplica os mapeamentos de entrada antes de chamar o serviço externo e os mapeamentos de saída depois de receber a resposta.
Um target de entrada é um caminho no corpo da requisição enviada, escrito exatamente como o serviço externo espera recebê-lo: não há objeto invólucro nem prefixo a acrescentar. Um source de saída é um caminho dentro do envelope de resposta, portanto os campos da resposta ficam sob body.
Exemplo rápido — mapeando campos do workflow para um node executor
Exemplo rápido — mapeando campos do workflow para um node executor
${executor-balance.balance}.Passo 4: Executar o workflow
Referencie a configuração de provider em um node de workflow do tipo
executor.
O exemplo abaixo cria um workflow de validação de pagamento sobre a conexão FraudShield do Passo 2. Quando um pagamento chega, o Flowker chama o serviço de verificação de fraude, avalia o score de risco e aprova ou rejeita o pagamento com base no resultado.
O workflow tem cinco nodes: um trigger webhook que recebe o pagamento, um node executor que chama o serviço de verificação de fraude, um node conditional que avalia o score, e dois nodes action para os resultados de aprovação e rejeição. Os edges os conectam em sequência, com o node condicional bifurcando para um ou outro caminho com base no limiar do score.
Use o endpoint Criar workflow para definir o workflow, depois Ative-o e por fim Execute-o.
Exemplo — Criar um workflow de validação de pagamento
Exemplo — Criar um workflow de validação de pagamento
check-fraud nomeia http — o conector HTTP genérico do catálogo — e a configuração FraudShield criada no Passo 2, que guarda a URL base e as credenciais. Os dois lados nomeiam o mesmo provider, então o workflow é salvo. O Flowker envia a requisição para https://api.fraudshield.example.com/score-transaction.O node não declara nenhum outputMapping, então a saída dele mantém o formato do envelope de resposta. Por isso o score fica em check-fraud.body.score, que é o que a condição de evaluate-score lê. Adicione um outputMapping quando preferir um nome mais plano — veja Mapeamento de campos e transformação de dados.Exemplo — Executar o workflow
Exemplo — Executar o workflow
Disparando workflows
As execuções de workflow são disparadas pelo endpoint Executar workflow:
inputData da execução. Todos os campos ficam disponíveis para os nodes seguintes pelo namespace workflow — por exemplo, workflow.transactionId ou workflow.amount. As saídas dos nodes ficam disponíveis pelo ID do node — por exemplo, check-fraud.body.score para um node que não declara nenhum outputMapping.
Idempotência
Toda requisição de execução deve incluir um headerIdempotency-Key. Requisições sem ele são rejeitadas com 400 Bad Request (erro FLK-0509). Gere um UUID novo para cada execução e reutilize a mesma chave apenas ao repetir a requisição idêntica.
Triggers de webhook
Webhooks são a principal forma pela qual sistemas externos disparam workflows do Flowker. Em vez de o seu sistema chamar diretamente a API de execuções, você registra um path de webhook em um workflow e os serviços externos enviam requisições HTTP para esse path.
Como funciona
- Adicione um node trigger do tipo
webhookao seu workflow com umpathe ummethodno seudata. Definainput_contractexplicitamente em nodes novos quando precisar de validaçãoopen,xsdouopenapi. - Quando o workflow é ativado, o Flowker registra o path no seu registro de webhooks.
- Sistemas externos enviam requisições para
POST /v1/webhooks/{path}(ou o método que você configurou). - O Flowker resolve o path para o workflow correspondente e o executa.
Definindo um node trigger de webhook
O trigger de webhook é um node comtype: "trigger" e triggerType: "webhook" no seu data, mais um path, um method e um input_contract opcional. Configurando um trigger de webhook cobre cada campo, os três modos de input_contract e o que cada um exige, e traz um node de exemplo para cada modo.
A configuração do trigger é um contrato fechado. Salvar um workflow cujo trigger de webhook omite path ou method, esquece um campo que o seu modo input_contract selecionado exige, nomeia o id de schema ou um campo de operação de outro modo, ou carrega uma chave ou um valor que o schema não aceita falha com FLK-0934. Uma declaração accepted_headers inválida falha em vez disso com FLK-0957. O schema também declara os campos opcionais response_mode, response_view e accepted_headers — consulte Configurando um trigger de webhook.
Protegendo um webhook
A entrega de webhooks usa a mesma autenticação do resto da API. Com o Access Manager habilitado (PLUGIN_AUTH_ENABLED=true), toda requisição para /v1/webhooks/* deve carregar um token Bearer (JWT OIDC), e quem chama precisa ter a permissão execute sobre o recurso webhooks. Requisições sem um token válido são rejeitadas com 401 Unauthorized.
Conceda essa permissão a uma identidade máquina-a-máquina para cada sistema que você permite chamar seus webhooks, e gerencie a concessão no Access Manager. Isso mantém o acesso aos webhooks sob o mesmo modelo de papéis e políticas da gestão de workflows, em vez de uma credencial presa ao path.
Metadados do webhook
O Flowker injeta automaticamente um objeto_webhook no inputData da execução com metadados sobre a requisição recebida:
Esses metadados ficam disponíveis para todos os nodes do workflow pelo namespace
workflow._webhook.
Notas importantes
- Cada combinação de path + método de webhook só pode ser registrada por um workflow ativo. Ativar um segundo workflow com o mesmo path falha com um erro de conflito.
- Os paths de webhook aceitam segmentos aninhados (ex:
payments/stripe/received). - O tamanho máximo do corpo da requisição é 1 MB.
- Desativar um workflow desregistra automaticamente as suas rotas de webhook.
Modo de resposta síncrona
Por padrão, um trigger de webhook responde com um recibo202 assim que a execução começa (o modo async) — quem chama precisa consultar o status da execução separadamente. Defina response_mode como "sync" no data do node trigger para que o Flowker mantenha a conexão HTTP aberta e retorne o resultado da execução diretamente na resposta:
Se a execução não alcançar um estado terminal antes de o limite interno de espera se esgotar, o Flowker recai no mesmo recibo
202 (com um header Location apontando para o endpoint de resultados) que o modo async teria retornado.
response_view seleciona o formato do corpo da resposta sync:
O
finalOutput de uma execução que falhou (nas visões full ou final_output) sempre carrega status: "failed" e errorMessage, e errorClass quando o Flowker conseguiu classificar a falha — nunca um {} vazio. Sem um override responseStatusCode (veja abaixo), o status HTTP sync permanece 200 para full/final_output/receipt (ele informa a saúde do transporte, não o resultado de negócio). Um responseStatusCode válido no node set_output terminal sobrescreve esse status para essas três visões.
Um node action com actionType: "set_output" pode carregar um responseStatusCode opcional (inteiro, 200–599) para sobrescrever o status HTTP que uma resposta de webhook sync retorna. Um valor fora do intervalo ou não inteiro é rejeitado ao salvar (FLK-0122). Para passthrough, o override se aplica apenas quando o próprio node set_output é o passo terminal — o status repassado de um executor terminal sempre vence, e o fallback sem resposta sempre usa um 200 simples para que um override nunca mascare uma falha.
A detecção de passthrough é estrita: só o passo terminal conta. Um set_output terminal depois de um executor é moldado pela sua própria saída — o Flowker nunca volta à resposta de um executor anterior. Em uma execução que falhou, o passo que interrompe o fluxo é o passo terminal, então um 4xx do provider que parou o workflow é repassado como o 4xx real.
Os valores na saída de um node set_output aceitam referências ${...} resolvidas contra o contexto do workflow — incluindo ${workflow.<campo>} (payload do trigger), ${execution.id}, ${execution.startedAt} e ${execution.now} (marcado no momento da interpolação). Uma referência ${...} que não possa ser resolvida faz o passo falhar (fail-closed).
Tratamento de erros
Se um node falha, a execução para e é marcada como
failed.
Não há fallback automático. Depois de esgotadas as retentativas, a execução falha.
Os resultados de execução informam o status da execução e stepResults. Uma etapa com falha fornece stepNumber, nodeId, status e errorMessage, com statusCode e errorClass quando disponíveis; output é opcional. Não prometa um errorCode, incluindo FLK-0504 ou FLK-0507, em todos os payloads de resultados de execução.
Retentativas e circuit breaker
O Flowker inclui resiliência integrada para as chamadas de executor.
Retentativas
Quando uma chamada de executor falha com um erro transitório — um erro de rede, um timeout na tentativa, qualquer status5xx, ou os status 408 ou 429 — o Flowker repete automaticamente. O comportamento de retentativa é configurável por node, no data do node executor:
As retentativas só se aplicam quando a operação é segura de repetir. Por padrão, chamadas
POST e PATCH são tratadas como não idempotentes e não são repetidas (uma única tentativa), enquanto GET, PUT, DELETE e outros verbos repetem normalmente. Um retry.max_attempts maior que 1 ativa as retentativas naquele node seja qual for o método. Um retry.max_attempts igual a 1 não é uma ativação — ele define uma única tentativa.
Erros não repetíveis se reduzem a uma única tentativa independentemente da configuração: circuit breaker aberto, contexto cancelado, erros de configuração, falhas ao resolver segredos, um corpo de requisição acima do teto de tamanho configurado, um corpo de resposta do provider acima do mesmo teto, e respostas 4xx não transitórias do provider (qualquer 4xx exceto 408 e 429).
A retentativa se aplica por execução de node. Se todas as tentativas falharem, o passo é marcado como falho e a execução para.
Circuit breaker
O Flowker usa um circuit breaker para proteger os serviços externos de serem sobrecarregados por chamadas falhas repetidas:
Erros
4xx de cliente/autenticação do provider não abrem o circuito: são problema de quem chama, não sinal de que o provider está fora do ar. Apenas falhas de transporte e 5xx contam para o limiar.
Quando o circuito está aberto, as chamadas de executor falham imediatamente com FLK-0507 em vez de alcançar o serviço externo. Isso evita falhas em cascata e dá tempo ao serviço externo para se recuperar.
Transições de estado do circuit breaker
Registro de configurações de executor
O Flowker mantém um registro de configurações de executor. O registro expõe quatro operações:
Cada registro carrega um
status, que a API informa em cada resposta:
O
PATCH aceita name, baseUrl, endpoints e authentication, mais os opcionais description e metadata. Ele não aceita status, mas a operação de listagem aceita status como filtro de consulta. A atualização se aplica a registros em status unconfigured ou configured; a remoção se aplica a registros em status unconfigured, configured ou disabled. Nenhuma operação nesta versão move um registro para tested, active ou disabled; a tabela lista esses valores porque as respostas os informam e o filtro de listagem os aceita.
Próximos passos
Conceitos fundamentais
Entenda workflows, nodes, edges e execuções.
API de Configurações de provider
Explore a API de configurações de provider.

