arazzo: 1.0.1 info: title: Flutterwave Transfer Verify And Retry summary: Send a transfer, verify its status, and retry it automatically when it failed. description: >- A resilient payout flow that initiates a transfer to an existing recipient, retrieves the transfer to inspect its status, and branches: when the transfer failed it calls the retry endpoint to re-attempt the payout, and when the transfer succeeded it ends. This mirrors how an operations team recovers from a transient payout failure without recreating the recipient. Every step spells out its request inline so the flow can be read and executed without opening the underlying OpenAPI description. version: 1.0.0 sourceDescriptions: - name: transfersApi url: ../openapi/flutterwave-transfers-api-openapi.yml type: openapi workflows: - workflowId: transfer-verify-and-retry summary: Initiate a transfer, verify it, and retry automatically on failure. description: >- Creates a transfer to an existing recipient, retrieves it, and branches to a retry step when the transfer failed or ends when it succeeded. inputs: type: object required: - accessToken - recipientId - amount - currency properties: accessToken: type: string description: OAuth2 client-credentials bearer token for the Authorization header. recipientId: type: string description: Identifier of an existing recipient to pay out to. amount: type: number description: Amount to transfer in the major currency unit. currency: type: string description: ISO currency code for the transfer. narration: type: string description: Optional narration shown on the payout. steps: - stepId: createTransfer description: Initiate a transfer to the existing recipient. operationId: createTransfer parameters: - name: Authorization in: header value: "Bearer $inputs.accessToken" requestBody: contentType: application/json payload: amount: $inputs.amount currency: $inputs.currency recipient_id: $inputs.recipientId narration: $inputs.narration successCriteria: - condition: $statusCode == 201 outputs: transferId: $response.body#/id - stepId: verifyTransfer description: Retrieve the transfer and decide whether a retry is required. operationId: getTransfer parameters: - name: Authorization in: header value: "Bearer $inputs.accessToken" - name: id in: path value: $steps.createTransfer.outputs.transferId successCriteria: - condition: $statusCode == 200 outputs: transferStatus: $response.body#/status onSuccess: - name: needsRetry type: goto stepId: retryTransfer criteria: - context: $response.body condition: $.status == "failed" type: jsonpath - name: succeeded type: end criteria: - context: $response.body condition: $.status == "succeeded" type: jsonpath - stepId: retryTransfer description: Retry the failed transfer to re-attempt the payout. operationId: retryTransfer parameters: - name: Authorization in: header value: "Bearer $inputs.accessToken" - name: id in: path value: $steps.createTransfer.outputs.transferId successCriteria: - condition: $statusCode == 200 outputs: retryStatus: $response.body#/status retryTransferId: $response.body#/id outputs: transferId: $steps.createTransfer.outputs.transferId transferStatus: $steps.verifyTransfer.outputs.transferStatus retryStatus: $steps.retryTransfer.outputs.retryStatus