Per-step funnel for an automation — the accurate per-campaign engagement source, matching the web app. For each node you get how many contacts reached each status and the real conversions at that step.
Prefer this over counting trigger_..._accepted tasks for acceptance/reply numbers: the trigger-task count is inflated in follow-up campaigns (contacts that entered already connected), whereas node_conversions.accepted here is the true count. Acceptance rate = node_conversions.accepted / node_statuses.closed on the connection-request node; replies per message node = node_conversions.replied.
node_ids is required — the integer ids of the nodes to report on (from GET /flows/api/flows/{flowUuid} → the active version's nodes[].id). Add a filter (e.g. an executed_at/date range) to scope the period.
curl -i -X POST \
'https://leadgen.grinfi.io/flows/api/flows/{flowUuid}/statistics/nodes' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"node_ids": [
2,
3,
6
]
}'Map of node_id → statistics. node_statuses counts contacts by task status; node_conversions holds the real outcomes (accepted, replied, opened, blocked) — an empty array for nodes that have none; node_branches (on rule/trigger nodes) counts how many took each branch.
{ "2": { "node_statuses": { … }, "node_conversions": { … } }, "3": { "node_statuses": { … }, "node_conversions": { … } } }