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

Getty Images API

Connect FlutterFlow to Getty Images API using a FlutterFlow API Group with OAuth 2.0 Bearer auth against https://api.gettyimages.com/v3. Because Getty uses a client secret for token exchange, you must proxy that step through a Firebase Cloud Function or Supabase Edge Function — the secret must never ship in the Flutter app binary. The free Developer tier returns only watermarked previews; licensed downloads require a Getty Partner agreement.

What you'll learn

  • Why Getty's OAuth client secret must be handled by a server-side proxy, not FlutterFlow
  • How to deploy a Firebase Cloud Function or Supabase Edge Function for the token exchange
  • How to configure a FlutterFlow API Group for Getty's search endpoint with Api-Key and Bearer headers
  • How to bind Getty search results to a GridView of Image widgets using JSON Path expressions
  • How to add debounce and 429 retry handling to respect Getty's strict rate limits
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate15 min read60 minutesMedia & ContentLast updated July 2026RapidDev Engineering Team
TL;DR

Connect FlutterFlow to Getty Images API using a FlutterFlow API Group with OAuth 2.0 Bearer auth against https://api.gettyimages.com/v3. Because Getty uses a client secret for token exchange, you must proxy that step through a Firebase Cloud Function or Supabase Edge Function — the secret must never ship in the Flutter app binary. The free Developer tier returns only watermarked previews; licensed downloads require a Getty Partner agreement.

Quick facts about this guide
FactValue
ToolGetty Images API
CategoryMedia & Content
MethodFlutterFlow API Call
DifficultyIntermediate
Time required60 minutes
Last updatedJuly 2026

Getty Is a Two-Tier Gate: Previews Are Free, Licenses Are Not

Getty Images API gives your FlutterFlow app access to millions of professionally licensed stock images, illustrations, and video through a REST API at https://api.gettyimages.com/v3. The primary endpoint for a search UI is /search/images — pass a phrase query, optional filters, and Getty returns an array of image objects with preview URIs, IDs, and referral links.

Before building, understand the two-tier model clearly. The free Developer tier provides full API access but all returned images are watermarked previews — they cannot be downloaded or used commercially without a license. Your FlutterFlow app can build a compelling search-and-preview experience on the free tier, but if users need clean, usable images they require a Getty Partner agreement. Surface this limitation in your app UI early so users are not surprised by watermarks.

Getty uses OAuth 2.0 client credentials for authentication: your API key and secret are exchanged for a short-lived Bearer token included in all API requests. The Api-Key header is also required on search calls as a separate identifier. Like Adobe Creative Cloud, the client secret cannot be embedded in the compiled Flutter app binary — it must stay server-side in a Firebase Cloud Function or Supabase Edge Function that returns a fresh token on demand. Getty's free-tier rate limits are strict; without a debounced search field you will hit 429 Too Many Requests rapidly on a live search text field.

Integration method

FlutterFlow API Call

FlutterFlow connects to Getty Images via a REST API Group targeting https://api.gettyimages.com/v3. Getty uses OAuth 2.0 client credentials authentication: your API key and secret are exchanged for a short-lived Bearer token. Because this exchange requires the client secret, it must run in a backend proxy (Firebase Cloud Function or Supabase Edge Function) — the secret cannot be embedded in the compiled Flutter app. FlutterFlow then calls the search endpoint directly with the Bearer token, displaying returned image URIs in a GridView of Image widgets.

Prerequisites

  • Getty Images developer account registered at developers.gettyimages.com — free to create
  • Getty developer application created in the developer portal to obtain your API Key and Secret
  • Firebase project (for Cloud Functions) or Supabase project (for Edge Functions) to host the token proxy
  • FlutterFlow project open at app.flutterflow.io
  • Basic understanding of FlutterFlow API Calls and App State variables

Step-by-step guide

1

Register a Getty developer app and get your API credentials

Open developers.gettyimages.com in your browser and sign in or create a free account. Navigate to My Account → Applications and click Create Application. Enter your app name, description, and intended use (select Developer / Non-commercial for the free tier). After submission, Getty will display your API Key and API Secret — copy both immediately and store them in a secure location such as a password manager or your Firebase/Supabase secrets panel. These two values are what your backend proxy will use to obtain Bearer tokens. Getty also provides a sandbox environment for testing at https://api.gettyimages.com/v3 — the same URL is used for both sandbox and production on the developer tier, but responses include watermarked images. If you eventually move to a Partner agreement, Getty provides separate Partner credentials with different rate limits and access to clean, licensed image downloads. For now, keep your API Key visible in the developer console; you will reference it when setting up both the proxy function and the FlutterFlow API Call headers.

Pro tip: Store your API Key and Secret in your Firebase or Supabase secrets panel immediately after copying them — never paste them into a FlutterFlow field, a local file, or a code comment.

Expected result: You have a Getty API Key and API Secret stored securely in your backend secrets panel, ready to configure in your Cloud Function or Edge Function environment variables.

2

Deploy a Cloud Function proxy for the OAuth token exchange

Getty's token exchange endpoint (https://authentication.gettyimages.com/oauth2/token) accepts your client_id (API Key), client_secret, and grant_type=client_credentials and returns an access_token valid for a limited window. This exchange must happen server-side because the client_secret cannot be embedded in your Flutter app. In your Firebase console open Functions or in Supabase open Edge Functions. Create a new function named gettyToken. Set environment variables GETTY_API_KEY and GETTY_API_SECRET to your credentials using Firebase Functions Secrets or Supabase's secrets panel — never hardcode them in the function source code. The function sends a POST request to Getty's token URL with the credentials, then returns just the access_token and its expiry to FlutterFlow. Deploy the function and note its HTTPS URL. Test the proxy by calling its URL in a browser or in Postman before wiring it to FlutterFlow. A successful response looks like: {"access_token": "ey...", "expires_in": 1800}. If the proxy returns an error, check that the environment variables are spelled correctly (GETTY_API_KEY, not GETTY_CLIENT_ID, for example — match exactly what your function code reads).

index.js
1// Firebase Cloud Function — Getty token proxy (Node.js)
2const functions = require('firebase-functions');
3const axios = require('axios');
4
5exports.gettyToken = functions.https.onRequest(async (req, res) => {
6 res.set('Access-Control-Allow-Origin', '*');
7 if (req.method === 'OPTIONS') { res.status(204).send(''); return; }
8
9 const apiKey = process.env.GETTY_API_KEY;
10 const apiSecret = process.env.GETTY_API_SECRET;
11
12 try {
13 const params = new URLSearchParams({
14 grant_type: 'client_credentials',
15 client_id: apiKey,
16 client_secret: apiSecret,
17 });
18 const resp = await axios.post(
19 'https://authentication.gettyimages.com/oauth2/token',
20 params.toString(),
21 { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
22 );
23 res.json({
24 access_token: resp.data.access_token,
25 expires_in: resp.data.expires_in,
26 });
27 } catch (err) {
28 res.status(500).json({ error: 'token_error', detail: err.message });
29 }
30});

Pro tip: Add basic request authentication to your proxy (e.g. a secret header value checked server-side) so that only your FlutterFlow app can call it — an open token-vending proxy could be abused.

Expected result: Calling your deployed proxy URL returns a JSON object with a valid access_token string. The Getty API Key and Secret appear only in Firebase/Supabase environment config, never in FlutterFlow or source code.

3

Create FlutterFlow API Groups for the token proxy and Getty search

In FlutterFlow, open API Calls in the left navigation bar. Click + Add → Create API Group and name it Getty Token Proxy. Set its Base URL to your deployed Cloud Function URL (e.g. https://us-central1-your-project.cloudfunctions.net). Add one API Call inside this group named getToken, method GET, no additional headers. This call returns the access_token you will cache in App State. Create a second API Group named Getty Images API with Base URL https://api.gettyimages.com/v3. In the Headers section add two headers: Authorization with value Bearer {{token}} and Api-Key with value {{apiKey}}. Add two group-level variables: token (String) and apiKey (String). The apiKey value is your Getty API Key — this is a public identifier and is acceptable in an API Call header (unlike the secret, which stays server-side). Inside the Getty Images API group, add an API Call named searchImages, method GET, endpoint /search/images. Add variables: phrase (String, required), image_type (String, default to 'photography'), and sort_order (String, default to 'best_match'). Add a query parameter fields with value display_set,title,id to request only the fields you need — this reduces response size and speeds up parsing. In the Response & Test tab, paste a sample Getty search response and click Generate JSON Paths. Key paths to note: $.images[0].display_sizes[0].uri (the watermarked preview URL), $.images[0].title, $.images[0].id, and $.images[0].referral_destinations[0].uri (the link to the full Getty page).

typescript
1// API Call config reference for Getty image search
2{
3 "method": "GET",
4 "endpoint": "/search/images",
5 "headers": {
6 "Authorization": "Bearer {{token}}",
7 "Api-Key": "{{apiKey}}"
8 },
9 "query_params": {
10 "phrase": "{{phrase}}",
11 "image_type": "{{image_type}}",
12 "sort_order": "{{sort_order}}",
13 "fields": "display_set,title,id"
14 }
15}
16// Key JSON paths:
17// $.images[0].display_sizes[0].uri → watermarked preview URL
18// $.images[0].title
19// $.images[0].id
20// $.images[0].referral_destinations[0].uri

Pro tip: The display_sizes array may have multiple entries with different sizes. Check the is_watermarked field if you want to confirm which URIs are watermarked previews vs partner-licensed images.

Expected result: Two API Groups appear in the API Calls panel: Getty Token Proxy (pointing to your Cloud Function) and Getty Images API (pointing to api.gettyimages.com). The searchImages API Call shows JSON Paths generated from the sample response.

4

Build the search screen with debounce and token caching

Create a search screen in FlutterFlow with a TextField widget for the search query. Also add a GridView widget that will display search results, and a CircularProgressIndicator that shows while results are loading. In App State, create three variables: gettyToken (String), gettyTokenExpiry (DateTime), and gettyApiKey (String — set this to your API Key as a constant, since it is a public identifier). On screen load (OnPageLoad Action Flow): check if gettyToken is empty or if the current time is past gettyTokenExpiry. If so, call the Getty Token Proxy getToken API Call, store the returned access_token in gettyToken, and set gettyTokenExpiry to now plus expires_in seconds. This caches the token for its valid lifetime. For the search TextField, you want debounce: instead of calling the API on every keystroke, add a Timer widget set to fire 600ms after the last key press. There are two ways to do this in FlutterFlow: use the TextField's onChange action with a delay parameter in a Wait action, or use a page-level timer variable that resets on each keystroke. When the timer fires, check if the text field has at least 2 characters, then call searchImages with the current text as phrase, passing gettyToken and gettyApiKey from App State. Map the returned images array to a page variable named searchResults. Inside the GridView, bind each item's display_sizes[0].uri to an Image widget's network URL. Add an overlay Text widget showing the image title. Add a tap action that opens the referral_destinations[0].uri in a WebView or launches it in the device's external browser.

Pro tip: Require a minimum of 2–3 characters before triggering the search API Call — single-character searches return enormous result sets and exhaust rate limits fast.

Expected result: Typing in the search field triggers the Getty API Call after a short delay. Search results appear as watermarked image thumbnails in the GridView. The token is fetched once and reused across searches within its validity window.

5

Add 429 rate-limit handling and a licensing disclaimer

Getty's free Developer tier enforces strict request rate limits. In the Action Flow Editor for the searchImages API Call, add an error branch: when the response status code is 429, show a SnackBar message saying 'Too many searches — please wait a moment and try again' and disable the search field for 5 seconds before re-enabling it. This prevents users from hammering the retry button. You can implement the 5-second cooldown with a Timer action that sets a Boolean App State variable isSearchDisabled to true, waits 5 seconds, then sets it back to false. Bind the TextField's enabled state to that Boolean. For the licensing disclaimer, add a Text widget below the GridView with wording such as: 'Images shown are watermarked previews. Licensing for commercial use requires a Getty Images Partner agreement. Tap any image to view licensing options on Getty.com.' Do not imply that users can freely download or use these images commercially — Getty enforces its licensing terms strictly and this could create legal exposure for your app. Also handle 401 errors: add an error branch that clears gettyToken in App State and re-fetches the token from the proxy before retrying the search. This handles the case where the token expires mid-session (Getty tokens are typically valid for 30 minutes on the free tier — check the current expires_in value from the token response for the actual window).

Pro tip: If you plan to build a production app with Getty, contact Getty's partner team early — the Partner tier has significantly better rate limits and unlocks clean image downloads. Start the conversation before you finish building.

Expected result: The app displays a clear watermark disclaimer below search results. A 429 response shows a user-friendly cooldown message and temporarily disables the search field. A 401 triggers a silent token refresh.

6

Gate download features and test across platforms

If your app includes a download or save button on search results, gate it behind a clear licensing flow. For the free Developer tier, the recommended pattern is to open Getty's referral URL in an external browser where users can license images directly on Getty's website. Do not attempt to download or cache the watermarked preview URIs as permanent assets — Getty's terms of service restrict this use. For the web build of your FlutterFlow app, test the Getty API Calls in Chrome DevTools Network tab to confirm no CORS errors appear. Since your FlutterFlow app calls Getty's API directly with a Bearer token (not through a proxy), some browser environments may flag CORS if Getty does not include a permissive Access-Control-Allow-Origin header for your domain. If you see XMLHttpRequest errors in the web preview, route the search calls through your Cloud Function proxy as well (not just the token exchange) to avoid CORS issues. For native iOS and Android builds, CORS is not enforced, so direct Getty API Calls work fine. Test on a physical device to verify image loading performance — Getty preview images can be large, and you may want to add the display_size=thumb query parameter to request smaller thumbnails in the grid view. If you'd rather skip the custom token-proxy setup entirely, RapidDev's team builds FlutterFlow integrations like this one every week — book a free scoping call at rapidevelopers.com/contact.

Pro tip: Request display_size=thumb in your search API Call for the grid view to load small thumbnails fast, and only load the full display_size=comp when the user taps an image to view details.

Expected result: The app correctly opens Getty's website for any licensing action rather than attempting to download watermarked images. The integration works on native device builds without CORS errors.

Common use cases

In-app stock photo search and preview gallery

A FlutterFlow app provides a search field where users type keywords and browse a GridView of watermarked Getty preview images. Users can view metadata (title, collection, ID) and tap to open the Getty referral link for licensing. The app serves as a visual reference tool for content planning without requiring Getty downloads in-app.

FlutterFlow Prompt

Build a stock image search screen where users type a keyword and see a grid of Getty Images watermarked previews with image titles and a 'View on Getty' button on each card.

Copy this prompt to try it in FlutterFlow

Brand imagery mood board builder

A FlutterFlow creative tool lets marketing teams search Getty for on-brand imagery concepts and save selected preview URIs to a Firestore mood board collection. The saved previews are displayed in a sharable board screen. The app helps teams align on visual direction without requiring immediate licensing.

FlutterFlow Prompt

Create a mood board feature where users search Getty images by keyword, tap to add previews to a named board saved in Firestore, and can view and share board collections with teammates.

Copy this prompt to try it in FlutterFlow

Editorial content illustration finder for a media app

A FlutterFlow editorial app auto-suggests relevant Getty Images results when a writer enters a story headline. Editorial images are displayed as preview thumbnails next to article drafts. Writers flag preferred images for later licensing through the full Getty portal, streamlining the editorial asset workflow.

FlutterFlow Prompt

Build an article editor companion screen that searches Getty Images based on the article headline and shows suggested editorial image previews that writers can flag for licensing review.

Copy this prompt to try it in FlutterFlow

Troubleshooting

429 Too Many Requests from Getty search API

Cause: The free Developer tier has strict rate limits per minute. An un-debounced search TextField sends a request on every keystroke, quickly exhausting the rate limit.

Solution: Add a 600ms debounce delay before the search API Call fires. Require a minimum of 2 characters before searching. On a 429 response, show a user-friendly message and disable the search field for 5 seconds before allowing another attempt.

XMLHttpRequest error in FlutterFlow web preview when calling Getty search

Cause: Getty's API may return CORS headers that block browser-origin requests. FlutterFlow's web preview runs in a browser, which strictly enforces CORS.

Solution: Route Getty search calls through your Cloud Function proxy in web environments: the proxy can forward the search request and relay the response with permissive CORS headers. Native iOS/Android builds do not enforce CORS and work with direct API Calls.

Image Grid shows broken image icons even though the API returns URIs

Cause: Getty's display_sizes[0].uri may require the Api-Key header for access, or the URI has expired. Some Getty preview URLs are signed and time-limited.

Solution: Verify that the image URI returned in $.images[0].display_sizes[0].uri is a direct HTTP URL and not a Getty-specific protocol. If images require auth headers, you may need to proxy image loading through your Cloud Function. Try opening a returned URI directly in your browser to confirm it loads without auth.

Token proxy returns 500 error with 'token_error' message

Cause: The GETTY_API_KEY or GETTY_API_SECRET environment variables are missing or misspelled in the Cloud Function configuration, or the credentials have been revoked in the Getty developer portal.

Solution: Check the Cloud Function logs in Firebase Console for the full error message. Verify that both environment variables are set correctly in Firebase Secrets Manager or the .env config. Confirm the credentials are still active in your Getty developer portal account.

Best practices

  • Never embed the Getty API Secret in FlutterFlow API Call headers or Dart code — it compiles into the app binary. Use a backend proxy exclusively for the token exchange.
  • Add a 600ms debounce on the search TextField — without it, a user typing 'landscape photography' sends 22 API Calls and you will hit the free-tier rate limit within seconds.
  • Display a clear licensing disclaimer on every screen showing Getty images: previews are watermarked and not licensed for commercial use without a Getty Partner agreement.
  • Cache the Bearer token in App State with an expiry timestamp and only call the token proxy when the cached token is absent or within 60 seconds of expiry.
  • Request only the fields you need using the fields query parameter (display_set,title,id) — this reduces Getty's response payload size and speeds up JSON parsing.
  • Add 401 error handling in the Action Flow to silently refresh the token and retry the search rather than showing an error screen to the user.
  • Use display_size=thumb for grid thumbnails and only load larger images on tap to keep the grid performant on slower mobile connections.
  • Test on a native device build — CORS behavior in the FlutterFlow web preview may not reflect how the integration works on iOS/Android.

Alternatives

Frequently asked questions

Can I display Getty Images in a commercial app on the free Developer tier?

You can display Getty's watermarked preview images in a commercial app UI, but end users cannot download or use those images commercially without a license. If your app's value proposition depends on users obtaining clean, usable Getty images, you need a Getty Partner agreement. The free tier is suitable for building search and preview functionality where licensing happens externally on Getty's website.

Why does the Getty token expire so quickly?

Getty's free-tier access tokens are short-lived (typically around 30 minutes — verify the exact expires_in value from your token response). This is standard OAuth 2.0 behavior for client credentials. Implement token caching in App State with an expiry timestamp and silently refresh the token in the background when it expires rather than prompting the user.

Can I use the Getty API without the OAuth token exchange? The docs mention an Api-Key header.

The Api-Key header alone identifies your application but does not grant full API access — most Getty endpoints require both the Api-Key header and a valid Bearer token from the OAuth flow. You cannot skip the token exchange for search endpoints. Only very limited metadata endpoints may work with Api-Key alone; check Getty's current API reference for exact requirements per endpoint.

What is the difference between Getty Images API and the iStock API?

Getty Images and iStock are both owned by Getty Images Group but use different APIs and licensing tiers. The Getty Images API (api.gettyimages.com) accesses the premium Getty editorial and creative collections. The iStock API provides access to the subscription-based iStock collection at lower price points. They require separate credentials and registrations. Most developers building apps use the Getty Images API unless they specifically target iStock content.

How do I let users download or save Getty images they find in my app?

On the free Developer tier, the correct approach is to open Getty's referral URL ($.referral_destinations[0].uri) in an external browser where the user can license and download the image through Getty's website. Do not attempt to save or re-host the watermarked preview URIs. If you need in-app download functionality, negotiate a Getty Partner agreement that includes embedded licensing capabilities.

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.