Connect FlutterFlow to Pingdom by creating an API Group with a Bearer token header targeting the Pingdom REST API v3.1. Call GET /checks and GET /summary.average/{checkid} to pull live uptime data into a read-only ops dashboard. No backend proxy is needed for read calls, but your Pingdom API token must stay in the API Group header—never hardcoded in Dart custom actions.
| Fact | Value |
|---|---|
| Tool | Pingdom |
| Category | DevOps & Tools |
| Method | FlutterFlow API Call |
| Difficulty | Intermediate |
| Time required | 45 minutes |
| Last updated | July 2026 |
Build a Live Site Status Dashboard with FlutterFlow and Pingdom
Pingdom is one of the most trusted names in website uptime monitoring, used by enterprises to know the second their sites go offline, measure real-user response times, and analyze historical outage windows. When your team is managing a SaaS product or client portfolio, opening the full SolarWinds console every time you want a status check is overkill. With FlutterFlow you can build a lightweight, focused ops dashboard that shows exactly what you need—which monitors are up, what their average uptime percentage is over the past 7 days, and when the last outage window was—right on your phone.
Pingdom's API v3.1 is a clean REST API authenticated with a Bearer token. The key endpoints for a monitoring dashboard are GET /checks (the full list of all your monitors, with live status), GET /summary.average/{checkid} (uptime percentage over a configurable period), and GET /summary.outage/{checkid} (individual outage windows). Pingdom enforces per-token rate limits surfaced in Req-Limit-Short and Req-Limit-Long response headers—so you should refresh data on page load and on user-triggered pull-to-refresh, not on a rapid automatic timer.
Pingdom is a paid product starting around $10/month for Synthetic Monitoring (verify current pricing at pingdom.com/pricing). If you need a free-tier alternative, see the UptimeRobot integration. One important note: the Pingdom API token you generate has full read access to your entire account's monitoring configuration. Treat it like a password—configure it once in FlutterFlow's API Group header and never paste it into a Custom Action Dart file, which compiles into your client app bundle and ships to every user's device.
Integration method
FlutterFlow connects to Pingdom through the API Calls panel, where you create a named API Group pointing at https://api.pingdom.com/api/3.1 and attach a shared Bearer token header. Every individual API Call you add inside that group (GET /checks, GET /summary.average/{checkid}, GET /summary.outage/{checkid}) inherits the auth header automatically. Responses are parsed with JSON Paths and bound to widgets to build a live status dashboard.
Prerequisites
- A Pingdom account on a paid Synthetic Monitoring plan (free trial available at pingdom.com)
- A Pingdom API token generated from Settings → Pingdom API in the Pingdom dashboard
- A FlutterFlow project (Starter plan or above) with at least one screen to place the status dashboard
- Basic familiarity with FlutterFlow's API Calls panel and JSON Path syntax
- At least one active check (monitor) configured in your Pingdom account to test against
Step-by-step guide
Generate your Pingdom API token
Log in to your Pingdom account at my.pingdom.com. In the top-right account menu click Settings, then navigate to the Pingdom API section. Click the Generate API Token button and give it a descriptive name like 'FlutterFlow Dashboard'. Copy the token immediately and store it in a secure location such as a password manager—Pingdom will not show the full token again after you navigate away. Before you leave the Pingdom dashboard, take note of the numeric Check IDs for any monitors you want to display in your app. You can find the ID by clicking on a check in the left panel and reading the number from the URL (e.g., /checks/12345678). You will need these IDs when building the detail and summary calls in FlutterFlow. Pingdom API tokens carry full read access across your entire account, including all checks, alert contacts, users, and historical data. For a dashboard app this is acceptable, but keep in mind this is not a scoped token—it is equivalent to a read-everything credential. Treat it with the same care as a password: do not share it, do not put it in source code, and do not paste it into any field that will compile into your Flutter app bundle. The only safe place in FlutterFlow is the API Group header, which is configured at build time and not exposed through Custom Action Dart.
Pro tip: In Pingdom's API Settings page you can see the current rate-limit tier for your token. Check the Req-Limit-Short and Req-Limit-Long values shown there, and plan your app's refresh frequency accordingly—never poll more often than your limit allows.
Expected result: You have a Pingdom Bearer API token copied to a secure location, and you know the numeric Check IDs of the monitors you want to feature in your FlutterFlow app.
Create the Pingdom API Group in FlutterFlow
In FlutterFlow, click API Calls in the left navigation panel. Click the + Add button and choose Create API Group. Name the group Pingdom and set the Base URL to https://api.pingdom.com/api/3.1. Do not include a trailing slash. With the API Group selected, click the Headers tab. Add a new header with the name Authorization and the value Bearer YOUR_TOKEN—replacing YOUR_TOKEN with the actual token string you generated in step 1. This header will be inherited by every API Call you add inside this group, so you configure authentication exactly once at the group level. Why the API Group header and not a Custom Action variable? When you set the token in the API Group header, FlutterFlow stores it in its project configuration at build time. It is not placed inside the Dart code that gets compiled into your app binary. By contrast, if you were to reference a token string inside a Custom Action (Dart code), that string would be compiled directly into the app bundle that ships to every user's device—where it can be extracted with basic tools. The API Group header approach is not perfectly secure for all threat models, but it is the most appropriate client-side approach for a read-only monitoring dashboard. Once you have set the header, click Save. The Pingdom group now appears in your API Calls list.
1{2 "group_name": "Pingdom",3 "base_url": "https://api.pingdom.com/api/3.1",4 "headers": {5 "Authorization": "Bearer YOUR_PINGDOM_API_TOKEN"6 }7}Pro tip: If your team has multiple Pingdom accounts or environments, create separate API Groups (e.g., 'Pingdom Prod' and 'Pingdom Staging') with different tokens—never mix tokens in the same group.
Expected result: A 'Pingdom' API Group appears in the API Calls panel with the Base URL set and the Authorization header configured. No individual API Calls have been added yet.
Add the GET /checks and summary API Calls and test them
Inside the Pingdom API Group, click + Add API Call. Name this call Get All Checks, set the HTTP method to GET, and set the endpoint path to /checks. Leave the request body empty—this is a plain GET request. Click Save. Next, add a second API Call named Get Uptime Summary. Set method to GET and endpoint to /summary.average/{checkid}. Go to the Variables tab and add a variable named checkid (type String). FlutterFlow will substitute {{ checkid }} in the endpoint path at runtime. Also add optional query variables: from (Unix timestamp for period start) and to (Unix timestamp for period end), both as String variables with empty defaults. Click Save. Optionally add a third call named Get Outage Windows at /summary.outage/{checkid} with the same checkid variable pattern. Now test your calls. Select the Get All Checks call and click the Test tab. You do not need to fill in any variables—this call uses only the shared Authorization header from the group. Click Send. You should receive a JSON response containing an array of check objects under the key checks. If you get a 401, double-check the token value in the group header for extra spaces or missing 'Bearer ' prefix. If you get a 403, your token may have been rotated or deleted in Pingdom. Once you see a successful response, click Generate JSON Paths—FlutterFlow will parse the response structure and offer paths like $.checks[0].name, $.checks[0].status, $.checks[0].hostname, and $.checks[0].lasttesttime.
1// Example successful GET /checks response (partial)2{3 "checks": [4 {5 "id": 12345678,6 "name": "My Production API",7 "type": "http",8 "lasttesttime": 1720512000,9 "status": "up",10 "resolution": 5,11 "hostname": "api.myproduct.com",12 "use_legacy_notifications": false,13 "created": 170000000014 }15 ],16 "counts": { "total": 3, "limited": 3, "filtered": 3 }17}1819// Useful JSON Paths:20// $.checks[:].id → list of check IDs21// $.checks[:].name → list of check names22// $.checks[:].status → 'up' | 'down' | 'paused'23// $.checks[:].hostname → hostname being monitored24// $.checks[:].lasttesttime → Unix timestamp of last testPro tip: Pingdom status values are lowercase strings: 'up', 'down', 'paused', 'unknown'. Store these as constants in your app and use conditional expressions in FlutterFlow to map them to colors and icons.
Expected result: Both API Calls appear inside the Pingdom group, the Test tab returns a valid JSON response for GET /checks, and FlutterFlow has generated JSON Paths you can use to bind data to widgets.
Create a Data Type and bind the response to a ListView
To make the API response easy to work with throughout your app, define a custom Data Type in FlutterFlow. Go to the Data Types panel (left nav → Data Types → + Add Data Type). Name it PingdomCheck and add the following fields: id (Integer), name (String), status (String), hostname (String), and lastTestTime (Integer). Next, build your status screen. Add a ListView widget to your screen. In the Actions panel for the page, add a Backend/API Call action that fires on page load, targeting your Get All Checks call. Enable Refresh Page Load so data loads when the screen opens. Select the ListView widget. Under Backend Query, set it to call your Pingdom API Group → Get All Checks and map the response using the JSON Paths you generated. Map $.checks[:].id to id, $.checks[:].name to name, $.checks[:].status to status, and so on. Inside the ListView, add a Card widget for each row. Place a Text widget bound to item.name for the check name. Add a Container widget with a ConditionalValue on its background color: if item.status equals 'up', use green (#4CAF50); if it equals 'down', use red (#F44336); otherwise use grey (#9E9E9E). This gives your users an immediate visual signal of which monitors are healthy. To support pull-to-refresh, wrap your ListView in a RefreshIndicator widget (available under the Layout Elements section in FlutterFlow). Wire the onRefresh callback to trigger the Get All Checks API Call again. This way users can manually reload data without setting an aggressive automatic timer that might hit Pingdom's rate limits. For the detail screen, create a new page and pass the check id as a parameter when the user taps a card. On that page, call Get Uptime Summary with the checkid parameter to show the average uptime percentage.
Pro tip: Use FlutterFlow's Conditional Visibility feature on a 'Down' banner Container to show an alert label only when item.status equals 'down'. This draws the eye immediately to any degraded monitors.
Expected result: Your status screen shows a list of Pingdom monitors with color-coded status indicators, monitor names, and hostnames. Pull-to-refresh manually reloads the data from the Pingdom API.
Add uptime percentage to the detail screen and handle rate limits
On your check detail screen, you want to show the 7-day or 30-day uptime percentage from GET /summary.average/{checkid}. Add a page parameter to this screen called checkId (String). On page load, trigger a Backend/API Call action for Get Uptime Summary, passing the checkId page parameter into the checkid variable. The response from /summary.average looks like this: { "summary": { "responsetime": { "avgresponse": 245 }, "status": { "totalup": 598500, "totaldown": 1200, "totalunknown": 0 } } }. You can calculate uptime percentage yourself: totalup / (totalup + totaldown + totalunknown) * 100. In FlutterFlow, use a Custom Function (left nav → Custom Code → + Add → Function) to perform this calculation. The Dart function takes three integer arguments and returns a double. Bind the return value to a Text widget formatted as a percentage. For rate limiting, Pingdom sends back Req-Limit-Short and Req-Limit-Long headers with each response indicating how many requests remain in the short-window and long-window periods (check your Pingdom plan documentation for the exact limits). FlutterFlow doesn't surface response headers natively in the UI, but the practical rule is: do not schedule automatic refreshes on a timer shorter than 60 seconds, and prefer on-demand refresh so the user controls when a network call happens. If you see a 429 Too Many Requests response, show the user a 'Too many requests—try again in a moment' message rather than retrying automatically. If you later want real-time push notifications when a monitor goes down, you will need a Firebase Cloud Function that receives Pingdom's outgoing webhook alerts and sends an FCM push notification to your app. That is a separate integration beyond this dashboard scope—but this read-only polling approach is a solid starting point for most founder use cases.
1// Custom Function: calculateUptimePercentage2// Add this in FlutterFlow → Custom Code → + Add → Function3// Dependencies: none45double calculateUptimePercentage(6 int totalUp,7 int totalDown,8 int totalUnknown,9) {10 final total = totalUp + totalDown + totalUnknown;11 if (total == 0) return 0.0;12 return (totalUp / total) * 100;13}Pro tip: Display the uptime percentage with one decimal place using Dart's toStringAsFixed(1) inside a Custom Function, e.g., '${calculateUptimePercentage(...).toStringAsFixed(1)}%'. This looks professional without false precision.
Expected result: The detail screen for each check shows the average uptime percentage calculated from the Pingdom summary endpoint, and your app refreshes data only on user interaction rather than on an aggressive timer.
Common use cases
SaaS founder mobile ops dashboard
A founder running a small SaaS product builds a personal FlutterFlow app that shows all their Pingdom monitors at a glance. Each monitor card displays the check name, current status (up/down/paused), and 30-day average uptime. A red indicator immediately calls out any degraded checks without logging into the Pingdom web console.
Build a screen that fetches all Pingdom monitors, shows each one in a card with its name, status badge colored green/red/grey, and 7-day uptime percentage. Include a pull-to-refresh gesture.
Copy this prompt to try it in FlutterFlow
Agency client-status app
A web agency managing uptime for 20+ client sites builds an internal Flutter app for their support team. The app lists all Pingdom checks grouped by client, lets a team member tap a check to see outage windows from the past 30 days, and surfaces the last downtime timestamp so support can respond proactively.
Create a list view of all Pingdom checks grouped by a tag. Tapping a check opens a detail screen showing the average uptime percentage and a list of recent outage windows with start time, end time, and duration.
Copy this prompt to try it in FlutterFlow
Client-facing uptime status screen
A managed-hosting provider embeds a read-only status page inside their customer-facing FlutterFlow mobile app, pulling live Pingdom data for that customer's specific monitors so clients can check their own uptime history without needing a Pingdom login.
Show a filtered subset of Pingdom monitors matching a specific tag, display current status and 90-day average uptime for each, and format the screen as a polished status page a client would trust.
Copy this prompt to try it in FlutterFlow
Troubleshooting
401 Unauthorized response from GET /checks
Cause: The Authorization header is malformed, the token was entered with extra whitespace, or the token has been deleted or rotated in the Pingdom dashboard.
Solution: In FlutterFlow, open API Calls → Pingdom group → Headers tab. Verify the header name is exactly 'Authorization' (capital A) and the value starts with 'Bearer ' followed by your token with no extra spaces. Cross-check by logging into Pingdom → Settings → Pingdom API and confirming the token still exists and hasn't been revoked.
429 Too Many Requests — Pingdom returns an error and data stops loading
Cause: Your FlutterFlow app is calling the Pingdom API more often than your plan's rate limit allows. Pingdom enforces per-token limits in both a short-window (Req-Limit-Short) and long-window (Req-Limit-Long). A timer-based automatic refresh polling every few seconds will exceed this quickly.
Solution: Remove any automatic timer-based refresh and rely only on page load and user-triggered pull-to-refresh. Add a minimum cooldown in your UI—disable the refresh button for 30 seconds after each successful call. If you need frequent updates, consider fetching data from a Firebase Cloud Function that caches Pingdom responses server-side and serves them to multiple app users from a single API token.
GET /summary.average/{checkid} returns 404
Cause: The checkid variable contains a string name rather than the numeric Pingdom check ID, or the check ID refers to a check that no longer exists or belongs to a different account.
Solution: Confirm you are passing the numeric id field from the GET /checks response (e.g., 12345678), not the check's text name. In FlutterFlow, verify your JSON Path for the id field is $.checks[:].id and that it is mapped to an Integer field in your PingdomCheck Data Type. If you hard-coded a check ID during testing, ensure it still exists in your Pingdom account.
Checks always show status 'unknown' even though Pingdom shows them as 'up' in the web console
Cause: The JSON Path used to extract status is incorrect, or the response was parsed before the status field was generated by the FlutterFlow JSON Path generator (which reads from the sample response, not live data).
Solution: Click Test on the Get All Checks API Call and verify the live response includes a 'status' key inside each check object. Then go to Response & Test → Generate JSON Paths to regenerate paths from the current response shape. Map $.checks[:].status to the status field of your PingdomCheck Data Type and re-run the page.
Best practices
- Store the Pingdom API token only in the API Group header—never paste it into a Custom Action Dart file or App Values constant, as those compile into the client binary.
- Use a read-only dashboard scope: stick to GET endpoints (/checks, /summary.average, /summary.outage). Avoid implementing write endpoints (pause/resume checks) in a client-side FlutterFlow app where the token could be extracted.
- Refresh data on page load and on explicit user pull-to-refresh rather than on an automatic timer to respect Pingdom's Req-Limit rate limits.
- Map the Pingdom 'status' field to FlutterFlow color constants in a single Custom Function so you change the color mapping in one place if your design system evolves.
- Create a PingdomCheck custom Data Type to give your widgets structured, named fields rather than raw JSON path strings, making the UI layer easier to maintain.
- Add a visible loading indicator (CircularProgressIndicator or shimmer) while the API call is in-flight, and an error state widget when the call returns a non-200 status so users always know what the app is doing.
- If you later need real-time alerting (push notifications on outage), implement a Firebase Cloud Function that receives Pingdom webhooks and sends FCM messages—do not try to poll for changes from the client app.
- Check Pingdom's current pricing and API rate limits at pingdom.com before launch—both have changed over time and the limits affect how frequently your app can realistically refresh.
Alternatives
UptimeRobot offers a generous free plan with 50 monitors and is the better choice if you don't already pay for Pingdom—though its API uses a very different POST/form-urlencoded authentication model.
StatusCake provides a similar uptime monitoring API with a free tier and REST authentication, making it a straightforward drop-in alternative to Pingdom in a FlutterFlow API Group.
Datadog covers uptime monitoring alongside full infrastructure metrics, logs, and APM—worth the higher cost if you need a single pane of glass beyond just website checks.
Frequently asked questions
Is it safe to put my Pingdom API token in a FlutterFlow API Group header?
Safer than putting it in Dart code, but not perfectly secure. The API Group header is stored in your FlutterFlow project configuration and does not appear as a string literal in the compiled app's Dart source. However, a determined attacker who intercepts network traffic from a device running your app could see the token in request headers. For a private internal ops dashboard used only by your own team, the API Group header approach is an acceptable tradeoff. For a publicly distributed app, consider routing Pingdom calls through a Firebase Cloud Function that holds the token server-side.
Can I use FlutterFlow to pause or resume Pingdom checks from a button in my app?
Technically yes—Pingdom has PUT endpoints to modify check settings. However, this is strongly discouraged for a client-side FlutterFlow app because the API token would need write access and that token could be extracted from device traffic. If an unauthorized user gained access to your app's network calls, they could pause all your monitoring. Keep the app read-only and perform any configuration changes directly in the Pingdom console.
Will this integration work on both iOS and Android?
Yes. FlutterFlow's API Calls panel generates standard HTTP requests that work on both platforms without any platform-specific configuration. For web builds, CORS could theoretically be an issue if Pingdom restricts browser origins, but since this dashboard is likely a native mobile app, CORS does not apply. Test on a real device or emulator rather than the browser-based FlutterFlow Run mode for the most accurate results.
How do I calculate uptime percentage from the Pingdom summary response?
The GET /summary.average/{checkid} response includes a status object with totalup, totaldown, and totalunknown fields (all in seconds). Uptime percentage = totalup / (totalup + totaldown + totalunknown) × 100. In FlutterFlow, create a Custom Function in Dart to perform this calculation and return a formatted string. See Step 5 for the code snippet.
What should I do if I need real-time push alerts when a monitor goes down?
The polling approach in this tutorial won't deliver instant alerts—it only shows current status when the user opens the app. For real-time push notifications, configure a Pingdom webhook (Settings → Alerting → Alert Recipients → Webhook) pointing at a Firebase Cloud Function. That function receives the alert, extracts the check name and status, and sends an FCM push notification to your FlutterFlow app. RapidDev's team builds this kind of hybrid integration every week—free scoping call at rapidevelopers.com/contact.
Do I need a specific Pingdom plan to use the API?
Pingdom API access is included on paid Synthetic Monitoring plans. The exact plan tier required may vary—check pingdom.com/pricing for current details. A free trial is typically available. The API endpoints covered here (/checks, /summary.average, /summary.outage) are available on standard plans, but some advanced reporting endpoints may require higher tiers.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation