Skip to main content
RapidDev - Software Development Agency
flutterflow-integrationsFlutterFlow API Call

Pixabay API

Connect FlutterFlow to Pixabay API with a single API Group using your API key as a query parameter — no OAuth, no token exchange, no proxy required. Create one GET API Call to https://pixabay.com/api/, bind the returned hits array to a GridView of Image widgets, and add a debounced search field to stay inside the 100-requests-per-minute free-tier rate limit.

What you'll learn

  • How to create a Pixabay API Call in FlutterFlow with a query-string key (no OAuth needed)
  • How to parse the hits[] response array and bind image URLs to a GridView
  • How to add a debounced search TextField to avoid hitting the 100 req/min rate limit
  • How to let users select images and save the chosen URL to Firestore or Supabase
  • Why even a free Pixabay key benefits from a server proxy in production
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner15 min read20 minutesMedia & ContentLast updated July 2026RapidDev Engineering Team
TL;DR

Connect FlutterFlow to Pixabay API with a single API Group using your API key as a query parameter — no OAuth, no token exchange, no proxy required. Create one GET API Call to https://pixabay.com/api/, bind the returned hits array to a GridView of Image widgets, and add a debounced search field to stay inside the 100-requests-per-minute free-tier rate limit.

Quick facts about this guide
FactValue
ToolPixabay API
CategoryMedia & Content
MethodFlutterFlow API Call
DifficultyBeginner
Time required20 minutes
Last updatedJuly 2026

No OAuth, Just a Query Key — Pixabay Is the Simplest Media API for FlutterFlow

Pixabay stands apart from Getty Images and Adobe Creative Cloud in one crucial way: there is no OAuth. No client secret. No token exchange. No server-side proxy needed to get started. You register a free account at pixabay.com, navigate to pixabay.com/api/docs, and copy your API key — it is a short alphanumeric string used as a query parameter named key on every request. The base URL is https://pixabay.com/api/ for images.

All Pixabay content is licensed under the Pixabay License — free for both commercial and non-commercial use, with no attribution required in most contexts. Over 4 million images, illustrations, vectors, and videos are available. The search endpoint accepts q (search phrase), image_type (photo, illustration, vector, or all), orientation, and category filters. Responses include a hits array where each object contains webformatURL (preview image up to 1280px), largeImageURL (full-size, also capped at 1280px on the free tier), and metadata like tags and download count.

The one real constraint is the 100-requests-per-minute rate limit on the free tier. An un-debounced search TextField sends a call per keystroke — easily 10+ calls in a few seconds — and your users will see blank results as 429 errors pile up. A 600ms typing delay solves this completely and makes the UX better at the same time.

Integration method

FlutterFlow API Call

FlutterFlow connects to Pixabay through a single API Group with one GET endpoint at https://pixabay.com/api/. Authentication uses a query-string API key — there is no OAuth, no token exchange, and no client secret to proxy. You add the key, search query, and image type as query variables in the API Call, bind the returned hits array to a GridView of Image widgets using JSON path expressions, and add a debounced TextField to avoid exceeding the 100-requests-per-minute free-tier rate limit.

Prerequisites

  • Free Pixabay account registered at pixabay.com — required to access the API key
  • Pixabay API key copied from pixabay.com/api/docs (shown after login)
  • FlutterFlow project open at app.flutterflow.io
  • A Firestore or Supabase backend (optional, needed only if you want to save selected image URLs)

Step-by-step guide

1

Register for Pixabay and copy your API key

Open pixabay.com in your browser and click Join for Free in the top right corner. Complete the free registration with your email address and confirm your account via the verification email. Once logged in, navigate to pixabay.com/api/docs — this is Pixabay's API documentation page and it also displays your personal API key in a green box near the top of the page once you are authenticated. The key is a short string of letters and numbers, typically around 30 characters. Copy this key now. You will use it as a query parameter in FlutterFlow — it is not an OAuth secret in the sense that it grants server-side access beyond your rate quota, but it is tied to your Pixabay account and your per-minute request limit. Treat it as semi-sensitive: do not commit it to a public GitHub repository, and for a production app consider routing requests through a simple backend proxy so the key is not visible in network traffic from client devices. For a prototype or internal tool, using the key directly in FlutterFlow as a query variable is acceptable to get started quickly.

Pro tip: Your API key is shown on the pixabay.com/api/docs page when you are logged in. Bookmark that page — it also contains all the query parameter documentation you will reference while building.

Expected result: You have your Pixabay API key copied and ready to use. You are familiar with the available query parameters from the docs page (q, image_type, orientation, category, per_page, page, min_width).

2

Create the Pixabay API Group and search API Call in FlutterFlow

In FlutterFlow, click API Calls in the left navigation bar, then click + Add → Create API Group. Name the group Pixabay API and set the Base URL to https://pixabay.com/api. Do not add any authentication headers — Pixabay uses query parameters only. Inside the group, click + Add API Call. Name it searchImages, set the method to GET, and leave the endpoint path blank (the group's base URL is the full endpoint). In the Query Parameters section, click + Add Parameter for each of the following: - key: set value to your API key string. This is a constant — you can hard-code it here since it is a query parameter, not a header secret, and Pixabay's free tier has no sensitive write access. - q: set as a variable named searchQuery (String). This receives the user's search input. - image_type: set as a variable named imageType (String) with a default value of 'all'. - per_page: set as a constant of 50 (the maximum per page on the free tier is 200, but 50 is a good balance for grid performance). - lang: optionally add as a variable named lang (String) defaulting to 'en'. Click Save, then open the Response & Test tab. In the Test API Call section, enter a test value for searchQuery such as 'mountain' and click Test. Paste the returned JSON response into the Sample JSON field and click Generate JSON Paths. FlutterFlow will auto-create paths including $.hits[0].webformatURL, $.hits[0].largeImageURL, $.hits[0].tags, and $.totalHits.

typescript
1// Pixabay API Call config reference
2{
3 "method": "GET",
4 "base_url": "https://pixabay.com/api",
5 "query_params": {
6 "key": "YOUR_API_KEY",
7 "q": "{{searchQuery}}",
8 "image_type": "{{imageType}}",
9 "per_page": "50",
10 "lang": "en"
11 }
12}
13// Key JSON paths from response:
14// $.totalHits → total result count
15// $.hits[0].id → image ID
16// $.hits[0].webformatURL → preview image URL (max 1280px)
17// $.hits[0].largeImageURL → full size URL (also max 1280px free tier)
18// $.hits[0].tags → comma-separated tag string
19// $.hits[0].user → uploader username

Pro tip: Set per_page to 50 rather than the maximum 200 — loading 200 images at once in a GridView creates noticeable scroll lag on lower-end devices.

Expected result: The searchImages API Call appears in the API Calls panel. Testing it with a sample query returns a JSON response with a hits array, and FlutterFlow has auto-generated JSON path expressions for webformatURL, tags, and totalHits.

3

Build the search screen with a debounced TextField and GridView

Create a new screen named ImageSearch in FlutterFlow. Add the following widgets from the top of the screen down: a TextField widget for the search query, a Text widget showing the result count (e.g. '24 images found'), and a GridView widget with 2 columns for the image results. For the TextField: set its label to 'Search free images...' and add an onChanged action. In the Action Flow Editor, add a Wait action with 600 milliseconds before the API Call action. This creates the debounce: only after the user pauses typing for 0.6 seconds does the app call Pixabay. This single step keeps you well inside the 100-requests-per-minute limit. After the Wait, add a Backend/API Call action: select Pixabay API → searchImages. Set the searchQuery variable to the TextField's current value. Map the response to a page-level variable named pixabayResults of type JSON (or use a FlutterFlow Data Type you define for images). Also map $.totalHits to a separate Integer page variable named resultCount. In the GridView: set its data source to the pixabayResults hits array. Inside the grid item widget, place an Image widget and bind its network URL to $.hits[i].webformatURL. Add a Tags Text widget bound to $.hits[i].tags below the image. Set a fixed height for each grid cell (e.g. 150px) so the grid renders at consistent size regardless of image aspect ratio. Add a loading shimmer or CircularProgressIndicator visible while the API Call is in progress.

Pro tip: Add a minimum character count check before the API Call fires — if searchQuery has fewer than 2 characters, skip the API Call. This prevents single-character searches that return enormous result sets.

Expected result: The search screen shows a TextField. Typing and pausing for 0.6 seconds triggers the Pixabay API Call and populates the GridView with image thumbnails. The result count Text widget updates to show the total number of matches.

4

Add image selection and save the chosen URL to Firestore or Supabase

To let users pick an image and use it elsewhere in the app, add a tap action to each GridView item. In the Action Flow Editor for the grid item's tap gesture: add a Set Variable action that stores the tapped image's webformatURL in a page-level variable named selectedImageUrl. Then, depending on your use-case, either navigate to another screen passing the URL as a parameter, or call a Firestore/Supabase write action to persist the selection. For a Firestore save: add a Firestore Action → Update Document or Create Document, writing the selectedImageUrl to the appropriate field in the user's document. For a Supabase save: add a Backend/API Call action pointing to your Supabase REST endpoint for the relevant table, passing the image URL in the request body. An important Pixabay terms-of-service note: Pixabay's API terms require that applications do not hotlink image URLs indefinitely in a way that circumvents their serving infrastructure. For images users actively select and want to keep, the best practice is to download the image bytes and re-upload them to your own storage (Supabase Storage, Firebase Storage, or Cloudinary) rather than saving only the Pixabay URL. Pixabay URLs can expire or change, and hotlinking at scale may violate their terms. For a prototype or low-traffic app, saving the URL directly is fine to get started — just plan the migration to your own storage before launch.

Pro tip: Pixabay's terms ask that you cache or host selected images in your own storage rather than hotlinking their URLs in production. Plan a Supabase Storage or Firebase Storage upload step for images users actively save.

Expected result: Tapping an image in the GridView saves its URL to a page variable and persists it to Firestore or Supabase. The selected image can be displayed elsewhere in the app via the stored URL.

5

Handle 429 rate limit errors and (optionally) proxy the key for production

Even with debounce, rapid or concurrent users can exceed the 100-requests-per-minute free-tier cap. In the Action Flow Editor for the searchImages API Call, add an error branch: when the HTTP status code is 429, show a SnackBar with the message 'Too many image requests — please try again in a moment' and set a Boolean page variable isRateLimited to true. Bind the TextField's enabled property to isRateLimited = false so the field is temporarily disabled. Use a Timer action to set isRateLimited back to false after 5 seconds. For a production app with multiple concurrent users, consider deploying a simple Firebase Cloud Function or Supabase Edge Function that proxies Pixabay requests using the API key stored in server environment variables. This centralizes rate limiting and hides the key from client network traffic. The proxy is optional for a Pixabay integration (unlike Getty or Adobe where it is mandatory for security), but it is good practice for any public-facing app. Finally, test your search screen on a physical device. Custom debounce timing can behave differently in FlutterFlow's web preview versus a native build — verify that searches fire correctly after the pause and that images load at an acceptable speed on a mobile data connection. The webformatURL previews are typically 100-400KB each, so a 50-image grid can load 5-20MB of images. Consider implementing infinite scroll with per_page=20 rather than loading 50 at once if you target users on slower connections.

Pro tip: For a public production app, always proxy the Pixabay key through a Cloud Function or Edge Function — it prevents key exposure in client network traffic and centralizes rate-limit control across all users. Book a free scoping call at rapidevelopers.com/contact if you'd like help setting this up.

Expected result: The app shows a friendly message and temporarily disables the search field on a 429 response. The integration works correctly on a native device build with acceptable image loading performance.

Common use cases

In-app royalty-free stock image picker

A FlutterFlow app provides a search field and a scrollable GridView of Pixabay images. Users browse freely, tap an image to select it, and the chosen webformatURL is saved to Firestore or Supabase as the featured image for a post, event, or product listing. No licensing step required — Pixabay images are free to use.

FlutterFlow Prompt

Build a stock image picker screen where users search Pixabay by keyword, browse a grid of results, tap to select one, and save the image URL to Firestore as the featured image for a blog post.

Copy this prompt to try it in FlutterFlow

Background image selector for a customizable profile or card

A FlutterFlow social or productivity app lets users personalize their profile card or event invitation with a Pixabay background image. The search UI opens in a bottom sheet, the user picks an image, and it is displayed as the card background. The selected URL is persisted in the user's profile document in Supabase.

FlutterFlow Prompt

Create a profile card customization screen with a 'Choose Background' button that opens a Pixabay image search bottom sheet — when the user taps an image it becomes the card background and saves to their Supabase profile row.

Copy this prompt to try it in FlutterFlow

Content illustration tool for a blog or newsletter app

A FlutterFlow content creation app auto-searches Pixabay with the article title keywords when a writer opens a new post. Suggested illustrations appear in a sidebar grid. The writer taps to insert an image URL into the post draft, replacing placeholder content with relevant visuals instantly.

FlutterFlow Prompt

Build an article editor with an illustration sidebar that searches Pixabay using the article title and shows suggested images the writer can tap to insert into their draft.

Copy this prompt to try it in FlutterFlow

Troubleshooting

429 Too Many Requests error when typing in the search field

Cause: The search API Call is firing on every keystroke without a debounce delay, exceeding Pixabay's 100-requests-per-minute free-tier limit.

Solution: Add a 600ms Wait action before the Pixabay API Call in the TextField's onChanged Action Flow. Also add a minimum character count check (at least 2 characters) before calling the API. On a 429 response, show a brief cooldown message and disable the search field for 5 seconds.

Image GridView shows broken image icons despite valid webformatURL values in the response

Cause: The webformatURL requires an active session or the URL may contain encoded characters that FlutterFlow's Image widget is not parsing correctly. Alternatively, the free-tier images may have a maximum resolution that causes issues with certain widget size configurations.

Solution: Open one of the returned webformatURL strings in your browser to confirm it loads correctly. If it does, check that the FlutterFlow Image widget's URL source is bound to the correct JSON path ($.hits[0].webformatURL not $.hits[0].largeImageURL — the latter may be unavailable on the free tier for very large images). Set a fixed image height in the widget to prevent layout calculation issues.

API Call returns 0 results even for common search terms

Cause: The API key query parameter may be missing, malformed, or the searchQuery variable is empty or contains special characters that are not URL-encoded.

Solution: In the FlutterFlow API Call test tab, manually enter a simple search term like 'cat' and run the test. Confirm the key parameter is present in the request URL shown in the test output. If the key is missing, check that it is correctly configured as a query parameter (not a header). FlutterFlow URL-encodes query variables automatically, so special characters in the search query should be handled.

Selected Pixabay image URLs stop loading after a few days in the app

Cause: Pixabay's image URLs can change or expire over time, especially if Pixabay updates their CDN configuration. Hotlinking URLs long-term is not guaranteed to be stable.

Solution: For images users actively select and save, download the image data and upload it to your own storage (Supabase Storage or Firebase Storage). Save the storage URL from your own backend instead of the Pixabay URL. This provides permanent, stable image hosting independent of Pixabay's URL structure.

Best practices

  • Add a 600ms debounce delay before every Pixabay API Call in a search TextField — without it you will hit the 100-requests-per-minute rate limit within seconds of a user starting to type.
  • Require a minimum of 2 characters in the search field before triggering the API Call — single-character searches return irrelevant results and waste rate-limit quota.
  • Use per_page=20 to 50 for grid views rather than the maximum 200 — loading 200 images at once creates noticeable lag on mid-range mobile devices.
  • For production apps with multiple users, proxy the Pixabay key through a Firebase Cloud Function or Supabase Edge Function to centralize rate limiting and prevent key exposure in client network traffic.
  • Save selected image URLs to your own Supabase Storage or Firebase Storage rather than hotlinking Pixabay URLs long-term — Pixabay URLs are not guaranteed to be permanent.
  • Bind to webformatURL for grid thumbnails (fast loading, smaller file) and only request largeImageURL when a user taps to view the full image.
  • Show a clear credit or 'Powered by Pixabay' attribution link on screens that display Pixabay content — while not strictly required by the Pixabay License, it is good practice and aligns with Pixabay's community guidelines.
  • Handle 429 errors gracefully with a user-facing message and a temporary cooldown — do not silently fail or show an empty grid without explanation.

Alternatives

Frequently asked questions

Is Pixabay free to use in a commercial FlutterFlow app?

Yes. All content on Pixabay is released under the Pixabay License which allows free use for commercial and non-commercial purposes without attribution required in most contexts. The API itself is also free at the standard rate limit. Read the full Pixabay License at pixabay.com/service/license-summary to understand any restrictions specific to your use case.

Can I use Pixabay images without crediting the photographer?

The Pixabay License generally does not require attribution, but Pixabay encourages it as a community courtesy. Some content contributors prefer attribution — if you show it, a simple 'Photo by [username] on Pixabay' with a link is the standard form. Always display 'Images provided by Pixabay' or a similar acknowledgment somewhere in your app if you use Pixabay content at scale.

What is the difference between webformatURL and largeImageURL in Pixabay's response?

webformatURL points to a resized preview image optimized for web display (typically around 640px wide). largeImageURL points to a larger version (up to 1280px wide on the free API tier). For full-resolution image access, users need to visit the Pixabay website directly. Use webformatURL for GridView thumbnails and largeImageURL only when a user taps to view a single image in detail.

Do I need to store the Pixabay API key in a backend proxy?

Unlike Getty or Adobe, the Pixabay API key does not grant any sensitive write access or incur financial liability — it only controls rate limiting per account. For a prototype, using the key directly in the FlutterFlow query parameter is fine. For a production app with many users, a backend proxy centralizes rate limiting across all users and prevents your personal API key from appearing in client network traffic, which is better practice.

How do I search for videos on Pixabay instead of images?

Pixabay has a separate video API endpoint at https://pixabay.com/api/videos/ with a similar query parameter structure. Create a second API Group in FlutterFlow with this base URL, use the same key query parameter, and the q and per_page parameters work identically. The response structure uses a hits array with a videos object containing links for tiny, small, medium, and large video files.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire FlutterFlow integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.