FlowRunner
Pricing
Theme
Start Free

Python and FlowRunner

Keep your Python where it runs. FlowRunner adds the parts around it: app triggers, approvals that wait days for a person, retries, schedules, and a record of every run.

2026-11-02 Updated November 3, 2026 8 min

Add FlowRunner when

  • Your script needs a yes from someone who doesn't read your logs, on Slack, email, WhatsApp, phone, or a Form
  • The job starts from an event in a business app, and you'd rather not write and host another webhook receiver
  • An answer can take days, and you don't want a process or a state table holding it open
  • Someone other than the author needs to see each run, what went in, and what came out

Python on its own is enough when

  • It's a one-off script you run by hand, or a notebook for research
  • The job touches no outside apps and no people, and you check failures yourself
  • It's a batch data pipeline your team already runs on Airflow

TL;DR

  • Python is where your automation logic lives: the script, the service, the model call, the algorithm you wrote. FlowRunner is what you add around it: triggers from 2,100+ integrations, approval steps that wait days for a person on email, Slack, WhatsApp, phone, or a Form, retries, schedules, and a record of every run that the rest of the team can read.
  • Your Python stays where it runs today. FlowRunner runs JavaScript, not Python, so it calls your code over HTTP or MCP, and your code calls FlowRunner through the Call Flow API.
  • The split that works: Python does the parts only code can do. FlowRunner does the plumbing you’d otherwise rebuild next to every script.
  • For a one-off script or a research notebook, Python on its own is enough, and this page says so below.

What Python is for

Python is the language most automation scripts and AI agents are written in. It’s open source, free under the Python Software Foundation License, and it has a library for nearly anything you need to parse, compute, or call. If the job is data work, a model, or an algorithm of your own, Python is the right place for it, and nothing on this page argues otherwise.

The language has no opinion about when a script runs, what happens when a call fails, or who gets told. That comes from the runtime you pick, and most teams pick one of these:

  • cron or a systemd timer on a server. Time-based runs and nothing else. Retries, history, and alerts are whatever the script writes.
  • GitHub Actions schedule. Cron inside CI, with run logs. GitHub’s docs say the shortest interval is once every 5 minutes, scheduled runs can be delayed under high load, and in a public repository they’re disabled after 60 days without activity.
  • Apache Airflow. Workflows “defined entirely in Python,” built for batch workflows with a clear start and end. You host the scheduler, workers, and metadata database, or buy a managed version.
  • AWS Lambda. Event-driven functions billed per use. A standard function times out at 15 minutes at most. Lambda durable functions go further: they checkpoint and replay, retry steps, wait for a time period or an external callback, and an execution can run up to a year.
  • A FastAPI or Flask service. HTTP endpoints, so other systems can call your Python. FastAPI’s own docs suggest BackgroundTasks for small jobs and a queue such as Celery with Redis or RabbitMQ for heavy ones.

Each of these is a good answer to “where does my code run.” None of them answers “how does the finance lead approve this from Slack on Thursday,” and that’s the gap the rest of this page is about.

What FlowRunner adds around it

Look at any Python automation that has been in production for a year and you’ll find the same extra code around the real logic. A webhook receiver with signature checks. OAuth tokens for three SaaS apps, and the refresh logic for each. Retry loops around every outside call. A table that holds state while someone decides, a Slack message with a link, a small page to answer on, and code to pick the job back up. Logs only the author reads.

FlowRunner is that layer, already built:

  • Triggers from 2,100+ integrations. A flow starts when an email with an attachment arrives in Gmail, a Shopify order comes in, a DocuSign envelope is completed, or a row is added to a Google Sheet. You connect the account once per workspace, and FlowRunner holds the auth. The catalog has 56,000+ callable actions (as of September 2026) for the steps after the trigger.
  • Approval steps that wait. A flow sends the request on email, Slack, WhatsApp, phone, or a Form with a public link, so the person answering needs no account and no access to your code. The run waits for the answer: up to 30 days on Free, Starter, and Growth, and up to a year on Professional and above. A run that waits three days is still one execution.
  • Retries and error paths. The HTTP Request block has a Retry Policy for status codes like 429 and 5XX and for network errors, with fixed or exponential backoff and jitter. A Handle Error block gives any step a failure path, so a bad call can alert someone and carry on.
  • A record of every run. Each run shows every block’s input and output. Log history is 24 hours on Free and Starter, 7 days on Growth, 30 on Professional, 90 on Business, and unlimited on Enterprise. From Professional, the audit log records who changed which flow and when.
  • Schedules. Once, every few seconds, daily, weekly, monthly, or a cron expression, with a start and an expiry, on any flow schedule.
  • Unlimited users and a canvas. Every plan includes unlimited users, so the ops lead and the controller can open the flow, see what it does, and check last night’s runs without asking you.

FlowRunner also has its own AI agents, which run on your own model keys (BYOK) and can call your Python as a tool. More on that below.

How they work together

The rule is simple: your code runs where it runs today. FlowRunner either calls it, or gets called by it. Here are the patterns that come up most. The Python guide has the code for each.

Your script hands off the part with a person in it. A nightly job reconciles payments and finds three that don’t match. Instead of emailing a CSV, it starts an approval flow with the non-blocking Call Flow API and gets an executionId back at once. The flow asks the controller on Slack, waits, and POSTs the decision to your endpoint. Your script never holds a process open, and the request, the answer, and the time it came are on the run record.

FlowRunner calls your service. Your FastAPI service scores leads, parses contracts, or runs a model nobody else can. A flow calls it with the HTTP Request block, retries on 5XX, and takes the result into the next steps: update a record, notify the owner, ask a person when the score is borderline. For a job that runs for minutes, your service answers right away and calls the flow’s External Callback when it’s done, and the waiting run picks up from there.

A business event starts your code. You don’t want to host another webhook receiver and keep a Shopify or Zendesk token fresh. A flow catches the event with that app’s trigger, cleans the payload, and calls your endpoint with only the fields your code needs. If the job runs on a timer instead, a FlowRunner schedule can call the same endpoint, and the schedule sits next to the run history.

Your functions become tools for an AI agent. Wrap a few functions in an MCP server with the official MCP Python SDK, put it at a public URL, and register it in FlowRunner with a token or OAuth 2.0. A FlowRunner AI Agent can then call your pricing function or your inventory lookup when it decides it needs one, and it can call a human-review flow as a tool in the same run.

Your service becomes blocks the whole team can use. If people outside engineering should use your service in their own flows, wrap its API in a custom extension: one JavaScript module, deployed with the FlowRunner CLI, with npm packages shipped in the deploy. npx flowrunner init-claude installs two Claude Code agents that write the extension and its tests. The service itself stays in Python; the extension is a thin client for it.

When you don’t need FlowRunner

Adding a platform has a cost, and some Python never needs one:

  • A one-off script. You run it by hand, read the output, and move on.
  • Notebooks and research. Exploration, analysis, model experiments. Nothing to trigger, nobody to ask.
  • Jobs with no apps and no people. A cron job that cleans a directory or rotates a file, where you check failures yourself, is fine on cron.
  • Batch data pipelines on Airflow. Airflow is built for scheduled batch workflows with a clear start and end, and a team that runs it well should keep it there.
  • A machine-to-machine wait. If a Lambda durable function waits on a callback from another system and no person is ever involved, it already has what it needs.

Add FlowRunner when the job crosses into business apps and people: an event in a SaaS app starts it, someone outside engineering decides part of it, or someone other than you needs to see what happened.

Feature comparison

DimensionPython on its ownPython with FlowRunner
Where the logic runsYour runtime: server, container, CI, serverless, AirflowThe same runtime, unchanged. FlowRunner doesn’t run Python
Triggers from SaaS appsA webhook receiver, signature checks, and OAuth refresh you write per app2,100+ integrations with the account connected once per workspace
Waiting for a personYou store state, send the message, build the answer page, and resumeA flow asks on email, Slack, WhatsApp, phone, or a Form and waits up to 30 days (Free, Starter, Growth) or a year (Professional and above)
Long waitsLambda durable functions up to a year; otherwise a live process or your own state tableThe run waits inside FlowRunner; your code gets the answer by HTTP
Retries on outside callsA retry library or your own loop, per callRetry Policy on the HTTP Request block; Handle Error for a failure path
Schedulescron, GitHub Actions (every 5 minutes at most), AirflowKeep yours, or a FlowRunner schedule calls your endpoint
Run historyWhatever the script logsEvery block’s input and output per run; 24 hours to unlimited by plan
Who can see itThe author, and whoever has server accessUnlimited users on every plan, on a canvas they can read
AI agentsYour own code and SDKYour code plus FlowRunner AI Agents on your keys, which can call your MCP server and a human-review flow as tools
CostYour runtimeYour runtime plus FlowRunner: Free at 100 executions a month, Starter from $5; one run is one execution

Frequently asked questions

Can FlowRunner run my Python code?

No. FlowRunner's Custom Cloud Code block runs JavaScript, and custom extensions are JavaScript modules too. Your Python stays where it runs today, on a server, in a container, in a serverless function, or in Airflow. FlowRunner calls it with the HTTP Request block or through an MCP server you register as agent tools, and your code calls FlowRunner through the Call Flow API or an External Callback.

How does a Python script get a human approval through FlowRunner?

The script starts an approval flow with the non-blocking Call Flow API, which returns an executionId at once. The flow sends the request on email, Slack, WhatsApp, phone, or a Form and waits for the answer. When the answer comes, the flow POSTs it back to an endpoint you run, with the executionId, and your code carries on. The Python guide has the code.

How long can a FlowRunner run wait for someone to answer?

Up to 30 days on Free, Starter, and Growth, and up to a year on Professional and above. The waiting run is still one execution, because FlowRunner counts one complete run as one execution however long it waits and however many steps it has.

Do I still need cron, Airflow, or Lambda?

Keep whatever runs your Python today. Airflow is built for batch data pipelines and stays the right home for them. FlowRunner sits next to it for the jobs that start from a business app, involve a person, or need a run record the rest of the team reads. If you want, a FlowRunner schedule can call your endpoint instead of a cron entry, so the schedule and the run history live in one place.

Can FlowRunner's AI agents call my Python functions?

Yes. Expose the functions as an MCP server, for example with the official MCP Python SDK, at a publicly reachable URL. Register it in FlowRunner under MCP Servers with a token or OAuth 2.0, and its tools can be attached to an AI Agent block, which decides when to call them. You can also call any HTTP endpoint from a flow with the HTTP Request block.

What does it cost to add FlowRunner to a Python project?

The Free plan is $0 with 100 executions a month and no card, and every new account starts with 14 days of Professional. Paid plans start at $5 a month for 300 executions. Every plan has every integration, AI agents on your own model keys, human-in-the-loop, and unlimited users and workflows. Your Python runtime costs whatever it costs today.

Editorial policy

Ready to try it?

Start on the Free plan. No card required, and every new account gets 14 days of Professional.