runId back immediately, then poll until it completes. This guide walks through the whole thing.
All examples assume you’ve set FLOWY_API and FLOWY_KEY from Authentication.
This touches all three scopes: listing and fetching a flow needs
apps:read, starting the run needs runs:write, and polling needs runs:read. A Full-access key has all three; a Read-only key can do every step except start the run.1
Find the flow you want to run
List the flows in your workspace and grab a flow’s
id.Response
2
Look up the flow's inputs
Fetch the flow to see which inputs it expects. Each input’s Use each input’s
name (its kebab-cased title) is the node_id you’ll send in the run request.Response
name (here selfie, style, references) as the node_id in the run request below.An input carrying arity is a variable input: the run accepts between arity.min and arity.max values for that one key. Send them as an array-valued asset_url (or prompt for text). Values beyond arity.max are ignored.3
Start the run
POST to the flow’s runs endpoint with an inputs array, unchanged from before, plus an optional params object for anything from the previous step’s params list. Each inputs entry’s node_id is a content input’s name; set its value with asset_url for media inputs (a URL) or prompt for text inputs (the text itself), an array for a variable input (arity). Each params entry is keyed by the param’s name, with a value matching its kind (a string for enum/text, a number, or a boolean). You get a runId back right away.Response
inputs stays lenient: an unrecognized node_id or a missing required content input never fails the request. Each is reported back as a warnings entry instead (unknown_input / missing_input), and the run still starts:Response with warnings
params is the opposite: it’s new, so it’s strict. An unknown name or an out-of-range/wrong-type value is rejected with 400 before the run starts. See Errors for unknown_param and invalid_param.4
Poll until it's done
Poll the run every couple of seconds until A node absent from
status is completed or failed. There’s no separate outputs array. A run’s result surface is nodeResults, its per-node record; the entries with isOutput: true are the ones the flow publishes (each carrying name, kind, and url or text). Output media URLs are signed and ready to download.Response
nodeResults was never executed (downstream of a failure, or a pass-through constant). A failed run’s non-output entries, status: "failed" with an error, are there for debugging, not part of the published result.