Connect FlutterFlow to CircleCI using the API Calls panel to read pipeline and workflow status from https://circleci.com/api/v2, authenticated with a Circle-Token header. Build an in-app CI/CD ops panel that shows recent pipeline states and lets authorized team members trigger new builds from a button. This is a monitoring integration—CircleCI does not build FlutterFlow apps.
| Fact | Value |
|---|---|
| Tool | CircleCI |
| Category | DevOps & Tools |
| Method | FlutterFlow API Call |
| Difficulty | Intermediate |
| Time required | 50 minutes |
| Last updated | July 2026 |
Build a CI/CD Ops Panel in FlutterFlow with the CircleCI API
CircleCI is the continuous integration backbone for thousands of software teams, automatically running tests and deploying code whenever a developer pushes to GitHub or Bitbucket. If your team uses CircleCI, you probably check build status from the CircleCI web dashboard—but having that information inside a custom FlutterFlow mobile app means your team lead can glance at pipeline health alongside other ops data without switching contexts.
Important framing for this integration: CircleCI does NOT build FlutterFlow apps. FlutterFlow compiles your project to Flutter code in its own cloud environment; you can optionally sync the exported code to GitHub and run it through a CI pipeline (using Codemagic or a Flutter-specific workflow), but that is a separate and advanced topic. What this tutorial builds is an in-app ops panel that reads your existing CircleCI pipelines—whatever code they build—and lets your team see build status and optionally trigger a new run from a button inside your FlutterFlow app.
The CircleCI API v2 uses a personal API token sent as a Circle-Token header (Bearer format is also accepted). The free plan includes 6,000 build minutes per month—verify current limits at circleci.com/pricing. The most important technical detail to get right is the project-slug format: it must be gh/ORG/REPO for GitHub repos (or bb/ for Bitbucket). Using just the repo name returns a 404, and this is by far the most common setup mistake when building CircleCI API integrations.
Integration method
FlutterFlow connects to CircleCI through the API Calls panel, where you create an API Group targeting https://circleci.com/api/v2 with a shared Circle-Token header for authentication. GET calls read recent pipelines, workflows, and job statuses for any project using the gh/ORG/REPO slug format. An optional POST call triggers a new pipeline run from a FlutterFlow button. All API calls fire from the client—keep the personal API token in the API Group header, never in Dart code.
Prerequisites
- A CircleCI account with at least one active project connected to a GitHub or Bitbucket repository
- A CircleCI personal API token generated from User Settings → Personal API Tokens
- The project slug for your repository in gh/ORG/REPO format (e.g., gh/mycompany/my-backend)
- A FlutterFlow project (Starter plan or above) with a screen to place the CI dashboard
- Basic familiarity with FlutterFlow's API Calls panel and Action Flow Editor
Step-by-step guide
Generate a CircleCI personal API token
Log in to your CircleCI account at app.circleci.com. Click your profile avatar in the bottom-left corner and choose User Settings. In the left sidebar of the settings page, click Personal API Tokens. Click the Create New Token button, give it a descriptive name like 'FlutterFlow Ops Dashboard', and click Add API Token. CircleCI will display the token value exactly once. Copy it immediately and store it in a password manager or secure notes application—you will not be able to view the full token again. If you lose it, you will need to revoke and create a new one. Understand the scope of this token: a CircleCI personal API token grants the same permissions as your user account. It can read pipeline data, trigger builds, cancel builds, and access environment variables (depending on project permissions). This is a broad-scope credential. For a FlutterFlow app, you will configure it in the API Group header at build time—this is safer than hardcoding it in Dart code, but it is still a client-side configuration. Consider what your app is distributing: if this is a private internal tool used only by your team, the API Group header approach is acceptable. If you were building a consumer app, you would need a backend proxy. Also note your project slug. In CircleCI, go to a project, look at the URL in your browser—it will look like app.circleci.com/pipelines/github/mycompany/my-backend. The portion after /pipelines/ is your base, but the API expects the format gh/mycompany/my-backend (replace 'github' with 'gh', or 'bitbucket' with 'bb'). This format difference is the source of countless 404 errors.
Pro tip: Write down your project slug in gh/ORG/REPO format right now. For example: if your GitHub org is 'acmecorp' and repo is 'backend-api', the slug is 'gh/acmecorp/backend-api'. Having this ready prevents the most common 404 error.
Expected result: You have a CircleCI personal API token copied securely, and you know your project slug in the correct gh/ORG/REPO format.
Create the CircleCI API Group in FlutterFlow
In FlutterFlow, click API Calls in the left navigation panel. Click + Add and choose Create API Group. Name it CircleCI and set the Base URL to https://circleci.com/api/v2. Do not include a trailing slash. With the CircleCI group selected, go to the Headers tab. Add a header named Circle-Token with your personal API token as the value. This is the authentication method CircleCI's v2 API expects. Alternatively, CircleCI also accepts the token as a Bearer token in an Authorization header, but the Circle-Token approach is more explicit and matches CircleCI's own documentation examples for API key auth. Also add an Accept header with value application/json to ensure responses come back in JSON format rather than XML. This header configuration is shared by every API Call you add inside this group, so you configure authentication once and every subsequent call inherits it automatically. Click Save. One clarification that prevents a lot of confusion: CircleCI personal API tokens are tied to your personal account, not a specific project. The token can access any project you have permission to view in CircleCI. This is convenient for a dashboard spanning multiple repos, but it also means the token is a sensitive credential—anyone who obtains it can read your pipeline data and, through the POST endpoints, trigger builds that consume your build minutes.
1{2 "group_name": "CircleCI",3 "base_url": "https://circleci.com/api/v2",4 "headers": {5 "Circle-Token": "YOUR_CIRCLECI_PERSONAL_API_TOKEN",6 "Accept": "application/json"7 }8}Pro tip: CircleCI also accepts 'Authorization: Bearer YOUR_TOKEN'. Either works—use whichever matches your team's preferred convention. The Circle-Token header is more self-documenting.
Expected result: A 'CircleCI' API Group appears in the API Calls panel with the base URL and Circle-Token header configured. No individual API Calls have been added yet.
Add the pipeline and workflow GET calls, and test
Inside the CircleCI API Group, add your first API Call. Click + Add API Call, name it Get Pipelines, set method to GET, and endpoint to /project/{project-slug}/pipeline. Go to the Variables tab and add a String variable named project_slug. In the endpoint field, it will be referenced as {{ project_slug }}. Optionally add an integer variable named page_token for pagination, though for an initial dashboard you can leave it out and let CircleCI default to the most recent 20 pipelines. Add a second API Call named Get Pipeline Workflows with endpoint /pipeline/{pipeline_id}/workflow. Add a String variable named pipeline_id. Add a third API Call named Get Workflow Jobs with endpoint /workflow/{workflow_id}/job. Add a String variable named workflow_id. For the trigger call (optional), add a fourth API Call named Trigger Pipeline, set method to POST, endpoint /project/{project-slug}/pipeline. Add the project_slug variable. On the Body tab, set content type to JSON and add a body of { "branch": "{{ branch_name }}" } with a branch_name variable. Add this body raw as: {"branch": "{{ branch_name }}"}. Test the Get Pipelines call: go to Response & Test, type your project slug in the variable field (e.g., gh/mycompany/my-backend) and click Send. A 200 response returns an items array with pipeline objects. A 404 almost always means the project-slug format is wrong—check that you used gh/ or bb/ prefix, not just the repo name. A 401 means the Circle-Token header value has an error. Click Generate JSON Paths. Key paths: $.items[:].id (pipeline ID for chaining), $.items[:].state (running/failing/errored), $.items[:].vcs.branch, $.items[:].created_at.
1// GET /project/{project-slug}/pipeline — example response (partial)2{3 "next_page_token": null,4 "items": [5 {6 "id": "abc-123-def-456",7 "errors": [],8 "project_slug": "gh/mycompany/my-backend",9 "updated_at": "2026-07-09T10:00:00Z",10 "number": 1042,11 "state": "created",12 "created_at": "2026-07-09T09:58:00Z",13 "trigger": { "type": "webhook" },14 "vcs": {15 "branch": "main",16 "revision": "a1b2c3d",17 "commit": { "subject": "fix: update payment handler" }18 }19 }20 ]21}2223// GET /workflow/{workflow_id}/job — example response (partial)24{25 "items": [26 {27 "id": "job-uuid",28 "name": "test-unit",29 "status": "success",30 "started_at": "2026-07-09T09:58:30Z",31 "stopped_at": "2026-07-09T10:01:00Z",32 "type": "build"33 }34 ]35}Pro tip: The pipeline 'state' field and workflow 'status' field are different: pipeline states are 'created', 'errored', 'setup-pending', 'setup', 'pending'; workflow statuses are 'success', 'running', 'not_run', 'failed', 'error', 'failing', 'on_hold', 'canceled', 'unauthorized'. Build your color mapping based on workflow status for the most useful visual signal.
Expected result: Your Get Pipelines call returns a valid JSON response with an items array. FlutterFlow has generated JSON Paths for pipeline IDs, states, branches, and creation timestamps.
Build the pipeline status ListView and wire the trigger button
Create a Data Type named CIPipeline with fields: id (String), number (Integer), state (String), branch (String), createdAt (String), commitMessage (String). Also create a WorkflowStatus Data Type with: id (String), name (String), status (String). On your CI dashboard screen, add a ListView widget. In the page's Action Flow (On Page Load), trigger a Backend/API Call to Get Pipelines, passing your project slug as the project_slug variable. Bind the ListView to the $.items array of the response. Inside each ListView item, add a Container for the pipeline card. Add Text widgets for: pipeline number (bound to $.items[:].number), branch name ($.items[:].vcs.branch), commit message ($.items[:].vcs.commit.subject, may be null—handle gracefully), and created date. For the status color, set the Container's background or left border color with a Conditional Expression. The workflow status (fetched separately via Get Pipeline Workflows) is the most meaningful indicator. For a simplified dashboard using only pipeline state from the first call: if state equals 'errored', use red; if state equals 'created', use blue; otherwise use grey. For the trigger button: add a Button widget below the list or in the app bar. In the Action Flow Editor, add an API Call action pointing to Trigger Pipeline. Pass your project_slug and a hardcoded branch value (e.g., 'main'). Before the API Call action, add a Confirm Dialog action (under Alerts & Notifications) that shows 'Trigger a new build on main branch? This will consume CI build minutes.' so users can't accidentally fire real builds. After a successful trigger, add a Show Snack Bar action with 'Build triggered!' and re-trigger the Get Pipelines call to refresh the list. Use Conditional Visibility to show the trigger button only to authorized users—for example, only show it if the logged-in user's email matches an admin email list stored in your FlutterFlow app state.
Pro tip: Gate the 'Trigger Build' button behind auth—a confirmation dialog is a UX safeguard, but access control based on user role is a security safeguard. Accidentally triggering real builds burns your monthly CI minutes budget.
Expected result: Your CI dashboard shows a list of recent CircleCI pipelines with branch names, pipeline numbers, states, and commit messages. A trigger button with a confirmation dialog lets authorized team members kick off a new build.
Chain workflow and job calls for detailed status, and handle common errors
For a richer detail screen, let users tap a pipeline card to see its workflows and jobs. Create a Pipeline Detail screen with a pipeline_id page parameter (String). On page load, call Get Pipeline Workflows passing pipeline_id as the pipeline_id variable. The response returns a list of workflows—bind these to a nested ListView showing workflow name and status. For each workflow, tapping it navigates to a Job List screen that calls Get Workflow Jobs with the workflow_id. This gives you a full three-level drill-down: pipeline → workflow → individual jobs. Job statuses ('success', 'failed', 'running', 'blocked') are highly actionable—a 'failed' job on a test step tells your team exactly what broke. Handling errors: the two most common API errors are 404 (wrong project-slug format) and 429 (rate limit). CircleCI applies per-token API rate limits—verify current limits in CircleCI's documentation. For the trigger endpoint (POST), each successful call spawns a real pipeline that consumes build minutes. If your team's FlutterFlow app accidentally fires many trigger calls (e.g., a user rapidly tapping the button), you could exhaust your monthly build minute quota. Implement a 30-second cooldown on the trigger button using FlutterFlow's app state: record the last trigger timestamp and disable the button if less than 30 seconds have elapsed since the last tap. For 401 errors on the Circle-Token header: double-check that the token value has no leading or trailing spaces in FlutterFlow's header configuration. Token values are case-sensitive. Remember the key message for your users: CircleCI does not build your FlutterFlow project. This integration monitors and triggers CI pipelines for backend/web code that CircleCI already knows about. FlutterFlow's own build pipeline (and optional GitHub export) is independent.
Pro tip: Add an App State boolean called 'triggerCooldownActive' and set it to true when a build is triggered. Use a Timer action (or check timestamps) to reset it after 30 seconds. Make the trigger button's opacity conditional on this state to signal it's temporarily disabled.
Expected result: Tapping a pipeline card opens a detail screen showing its workflows and statuses. The trigger button is rate-limited by a cooldown state. You can trace a failing pipeline all the way to the specific job that failed.
Common use cases
Team build-status mobile app for a dev team
A five-person development team builds a FlutterFlow app for their engineering lead to check CircleCI pipeline status during standups. The app lists the last 10 pipeline runs for their main repository, shows each run's state (running, success, failed, on_hold), the triggering branch, and the time it started. A failed pipeline shows a red card at the top of the list.
Build a screen showing the 10 most recent CircleCI pipelines for a specific project. Each row shows the pipeline number, branch, state, and creation time. Color failed pipelines red, success green, and running pipelines with a blue pulsing indicator.
Copy this prompt to try it in FlutterFlow
Deploy trigger button in an internal ops dashboard
A startup's operations team has a FlutterFlow internal tool that aggregates deployment triggers for different services. They add a CircleCI section where a team admin can tap a 'Deploy to Production' button that triggers a CircleCI pipeline on the main branch, with a confirmation dialog to prevent accidental triggers.
Create a button that triggers a CircleCI pipeline on the 'main' branch of a specific project. Show a confirmation dialog before sending the request. After triggering, show a success toast and refresh the pipeline list to show the new run at the top.
Copy this prompt to try it in FlutterFlow
Failed build notifications panel
A QA engineer builds a personal FlutterFlow dashboard that filters CircleCI pipelines to show only failed workflows, lists the failed job names within each, and displays which commit triggered the failure. This becomes a quick morning review tool to see what broke overnight without logging into the CircleCI web console.
Fetch CircleCI pipelines and their workflows, then filter to show only failed workflows. For each failure, show the pipeline number, the failing workflow name, the VCS revision, and when it failed. Add a refresh button in the app bar.
Copy this prompt to try it in FlutterFlow
Troubleshooting
GET /project/{project-slug}/pipeline returns 404
Cause: The project-slug variable is formatted incorrectly. Using just the repository name (e.g., 'my-backend') or the full GitHub URL instead of the required gh/ORG/REPO format will consistently return 404.
Solution: Update the project_slug variable value in your API Call test to use the exact format: gh/YOUR_ORG/YOUR_REPO for GitHub repos, or bb/YOUR_ORG/YOUR_REPO for Bitbucket. You can verify the correct slug by navigating to your project in the CircleCI dashboard and reading the URL path: app.circleci.com/pipelines/github/ORG/REPO → slug is gh/ORG/REPO.
401 Unauthorized — all API Calls fail immediately
Cause: The Circle-Token header value is missing, has extra whitespace, or the token has been revoked in CircleCI.
Solution: In FlutterFlow, open API Calls → CircleCI → Headers tab. Verify the header name is 'Circle-Token' (case-sensitive) and the value matches exactly what CircleCI showed when you created the token. If you suspect the token was compromised, go to CircleCI User Settings → Personal API Tokens, revoke the old token, create a new one, and update the FlutterFlow header.
POST /pipeline trigger call returns 201 but the pipeline doesn't appear in CircleCI
Cause: The 201 response means CircleCI accepted and queued the pipeline, but it may be in a pending state waiting for an available runner, or the branch name passed in the body doesn't exist in the repository.
Solution: Check the CircleCI dashboard for the project—the triggered pipeline should appear within a few seconds even if it takes longer to start running. If you see a pipeline error on the CircleCI side, the most common cause is a branch name typo in the FlutterFlow POST body. Verify the branch variable value matches an existing branch name exactly. Also confirm your CircleCI project has an active config.yml for the target branch.
Pipeline state always shows 'created' even for builds that ran hours ago
Cause: Pipeline state (from GET /pipeline) reflects the pipeline creation state, not the final workflow outcome. Successful or failed builds show 'errored' or 'created' at the pipeline level—you need to call GET /pipeline/{id}/workflow to see the workflow-level status which reflects 'success' or 'failed'.
Solution: Add a Get Pipeline Workflows API Call and chain it to your pipeline list—for each pipeline, fetch its workflows to get the meaningful status field. On the detail screen, use workflow status ('success', 'failed', 'running') for color-coding rather than pipeline state.
Best practices
- Store the CircleCI personal API token only in the API Group header—never paste it into a Custom Action Dart string, App Values, or any field that compiles into the client app binary.
- Always pass the project-slug in gh/ORG/REPO format; validate this is correct during development by testing the API Call in FlutterFlow's Response & Test tab before building the UI.
- Gate the pipeline trigger button behind authentication and authorization—only show it to team members with admin roles, and add a confirmation dialog to prevent accidental build triggers.
- Add a cooldown on the trigger button (30-60 seconds) to prevent rapidly firing multiple pipeline runs that consume your monthly build minute quota.
- Use workflow-level status fields ('success', 'failed', 'running') for color-coding, not pipeline-level state fields—workflow status is more meaningful and actionable.
- Be explicit with your users that CircleCI does not build the FlutterFlow app itself—this integration monitors and triggers CI pipelines for code CircleCI already manages.
- For a multi-project ops panel, accept the project-slug as a user-entered field or a dropdown populated from a list of known slugs stored in App State, rather than hardcoding a single project.
- Verify CircleCI's current rate limits and pricing before launch at circleci.com/docs—both have changed over product iterations, and build minute overages can be costly.
Alternatives
Jenkins is self-hosted and free at any scale, making it the alternative if your team avoids SaaS CI tools—though its API requires more setup and authentication varies by plugin.
Travis CI offers a similar hosted CI model with a REST API using a Bearer token pattern, and may already be set up if your open-source repos used it before CircleCI.
GitLab combines CI/CD with version control in one platform, and its Pipelines API supports a similar FlutterFlow integration pattern if your team already hosts code on GitLab.
Frequently asked questions
Does CircleCI build my FlutterFlow app?
No. CircleCI does not build FlutterFlow projects. FlutterFlow compiles your visual design to Flutter code in its own cloud environment. If you export your FlutterFlow code to GitHub and want a CI pipeline for that code, you would need a Flutter-specific CI setup (Codemagic is designed for this). The integration in this tutorial is about reading pipeline data from CircleCI projects your team already manages—it does not create any connection between CircleCI and FlutterFlow's compiler.
Why does GET /project/my-repo/pipeline return 404?
The project-slug format must include the VCS prefix. For GitHub repos, the format is gh/YOUR_ORG/YOUR_REPO. For Bitbucket repos it is bb/YOUR_ORG/YOUR_REPO. Using just the repo name (my-repo) or the GitHub URL (github.com/org/repo) will always return 404. Verify the correct slug by looking at your project's URL in the CircleCI dashboard: app.circleci.com/pipelines/github/ORG/REPO → slug is gh/ORG/REPO.
Can I use this to monitor multiple repositories from one FlutterFlow app?
Yes. Since a CircleCI personal API token grants access to all projects your account can see, you can build a multi-repo dashboard by storing a list of project slugs in FlutterFlow's App State and looping through them to call GET /project/{slug}/pipeline for each. Display results in a grouped ListView organized by project name. Be mindful of API rate limits if you are fetching data for many repositories simultaneously.
Is it safe to let app users trigger CircleCI builds?
It depends on who uses your app. If this is a private internal tool limited to your development team, triggering builds from a mobile app is a reasonable convenience feature. If you distribute the app more broadly, you risk unauthorized build triggers that exhaust your monthly CI minutes. Always put the trigger button behind authentication and role-based conditional visibility, and add a confirmation dialog. For public-facing apps, route the trigger through a backend that verifies user identity before calling CircleCI's API.
How do I show the specific jobs that failed in a pipeline?
You need to chain three API calls: GET /project/{slug}/pipeline → GET /pipeline/{id}/workflow → GET /workflow/{id}/job. The job-level response includes a 'status' field ('success', 'failed', 'running', etc.) and the job 'name' from your CircleCI config.yml. On a pipeline detail screen, show each workflow's jobs in a nested list—failed jobs will stand out and tell your team exactly which step (lint, unit-test, build, deploy) broke.
How can I get notified in my FlutterFlow app when a build fails without polling?
CircleCI supports webhooks that fire on pipeline, workflow, and job events. Configure a CircleCI webhook pointing at a Firebase Cloud Function, which then sends a push notification via Firebase Cloud Messaging (FCM) to your FlutterFlow app. This gives your team instant failure alerts without any API polling. RapidDev builds this kind of webhook-to-FCM pipeline frequently—free scoping call at rapidevelopers.com/contact.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation