Getty Images connects to Bubble via two API Connector calls: a POST to authentication.gettyimages.com to exchange your client credentials for a Bearer token (stored in an App Settings record), then GET calls to api.gettyimages.com/v3/images/search with that token in a Private Authorization header. Tokens expire in 30 minutes — a scheduled Backend Workflow refreshes them proactively on paid Bubble plans. Note: API access requires an application approval from Getty (1-3 business days).
| Fact | Value |
|---|---|
| Tool | Getty Images API |
| Category | Media & Content |
| Method | Bubble API Connector |
| Difficulty | Intermediate |
| Time required | 5–8 hours (plus 1-3 days API approval wait) |
| Last updated | July 2026 |
Getty Images + Bubble: premium stock photography with OAuth token management
Getty Images is in a different tier from Pixabay or Shutterstock's Basic Auth path. It requires an application approval before any API access (no instant sandbox), OAuth 2.0 Client Credentials token management with a 30-minute expiry, and careful attention to licensing rules before displaying assets in any published context.
The builder profile for this integration is clear: professional media teams, newsrooms, and content production agencies who already use Getty Images for licensed photography and want a Bubble-based editorial tool — an image search and review board, a content calendar with Getty assets, or an internal media library browser.
For these teams, the Bubble API Connector handles both phases of the OAuth flow. The first API Connector call is the token acquisition: a POST to `https://authentication.gettyimages.com/oauth2/token` with your `client_id` and `client_secret` in the request body, both marked as Private so they never leave Bubble's servers. This call returns an `access_token` string valid for 1800 seconds. Store this token and its expiry timestamp (current time + 1800 seconds) in a dedicated App Settings data type.
The second API Connector group (or additional calls in the same group) is where image searching happens: GET calls to `https://api.gettyimages.com/v3/images/search` with the `Authorization: Bearer [stored token]` header dynamically populated from App Settings. Because the token expires, a scheduled Backend Workflow must regenerate it every 25 minutes — a paid Bubble plan feature. On Free plans, you trigger the token refresh manually or on page load.
Getty's search response returns a `images` array where each item includes a `display_sizes` field — an array of objects with `name` (thumb, comp, preview) and `uri` fields. Bubble's API Connector auto-detects this nested structure after Initialize, but navigating from a Repeating Group row to a specific size variant (the `thumb` URI) requires knowing the field path: `Current cell's display_sizes:filtered by name=thumb:first item's uri`.
A legal note that must be in your app's UX: Getty's comp (full-resolution watermarked) images are for selection preview only. Displaying them as content in a published Bubble app without a commercial license is a licensing violation that Getty actively enforces. Always display preview images with a visible 'Watermarked Preview — Not for Publication' label.
Integration method
Two API Connector calls: OAuth 2.0 client credentials token acquisition (POST to authentication endpoint, Private body params) and image search/asset calls (GET to api.gettyimages.com with Private Bearer token from App Settings).
Prerequisites
- An approved Getty Images API application — apply at developers.gettyimages.com (approval takes 1-3 business days; there is no instant sandbox)
- Your Getty Images API client_id and client_secret from the developer portal
- An existing Getty Images account or relationship (commercial licensing requires a Getty subscription or per-image purchase agreement)
- The API Connector plugin installed in your Bubble app (Plugins tab → Add plugins → search 'API Connector' by Bubble)
- A Bubble paid plan (Starter or higher) for the scheduled Backend Workflow token refresh in production — Free plan requires manual token refresh
- A clear understanding of the editorial vs creative asset distinction and your organization's licensing coverage before displaying any Getty assets in your app
Step-by-step guide
Apply for Getty Images API access and collect your credentials
Getty Images API access is not instant — it requires an application review. Go to **developers.gettyimages.com** and click **Get API Key** or **Apply for API Access**. Log in with your Getty Images account (create one at gettyimages.com if needed — a basic account is free). Fill out the application form: - **Application name**: what you are building (e.g., 'Editorial Asset Curation Tool') - **Application type**: most Bubble apps should select 'Internal' or 'Enterprise' — do not select 'Developer Demo' for production use - **Use case description**: explain specifically how you intend to use the API. Be accurate — vague descriptions are more likely to be rejected or delayed - **Website URL**: your Bubble app's domain or your organization's website Submit the application. Getty typically responds within 1-3 business days with either approval (credentials emailed) or a request for more information. Once approved, the developer portal gives you: - **Client ID**: a string identifying your application - **Client Secret**: a confidential string — treat this like a password Copy both values and store them in a secure location (password manager). You will need them for the Bubble API Connector configuration. **While waiting for approval**: use this time to set up your Bubble data types (App Settings with token fields), install the API Connector plugin, and design your image search UI layout. The integration setup can be completed before you have real credentials, using placeholder values — you will only be blocked at the Initialize call step until approval arrives.
Pro tip: If your intended use case involves displaying Getty images publicly in a Bubble app (not just in an internal dashboard), mention this explicitly in your application. Getty's terms distinguish between search/preview access (allowed without a content license) and embedding licensed images in published content (requires a commercial relationship). Being clear about your use case upfront avoids approval issues later.
Expected result: You receive approval from Getty Images with your client_id and client_secret. You can now proceed with configuring Bubble's API Connector. If you have not yet been approved, you can build all UI elements and configure the API Connector structure — you will complete the Initialize calls once credentials arrive.
Create the Bubble data type for token storage and add the API Connector plugin
Before configuring the API, create the data infrastructure to store the OAuth token. In your Bubble editor, go to the **Data tab** (database icon in the left sidebar). Click **Add a new type** and name it `App Settings`. Add two fields: - Field: `getty_access_token`, Type: **text** — stores the current Bearer token - Field: `getty_token_expires_at`, Type: **date** — stores when the current token expires Click **All App Settings** (the data view) and manually create one empty App Settings record. This single row will hold the current token and be updated by the refresh workflow. (One row is all you need — you will update it in place.) Now install the API Connector: **Plugins tab** → **Add plugins** → search **API Connector** → install the plugin by Bubble (first result, free). Open the API Connector configuration panel by clicking **API Connector** in the Plugins list. Click **Add another API** and name it `Getty Token`. Set **Authentication** to **No authentication** (you will handle auth in the request body).
Pro tip: Create the App Settings data type with only one row (manually in the Data tab). All token refresh workflows will update this single row rather than creating new rows. Use Bubble's 'Make changes to a Thing' action targeting the existing row — not 'Create a new Thing' — to avoid accumulating hundreds of stale token records.
Expected result: The App Settings data type exists with getty_access_token (text) and getty_token_expires_at (date) fields. One empty App Settings record exists in the database. The API Connector plugin is installed and the Getty Token API group is created.
Configure the OAuth 2.0 token acquisition call
In the **Getty Token** API Connector group, click **Add a call** to configure the token exchange. Set: - **Name**: `Get Access Token` - **Use as**: **Action** (this call modifies data and should be triggered by a workflow, not used as a data source in a Repeating Group) - **Method**: **POST** - **URL**: `https://authentication.gettyimages.com/oauth2/token` - **Body type**: **Form-urlencoded** In the **Body** section, add these parameters (ALL marked **Private**): - `grant_type` = `client_credentials` (this is fixed — not sensitive, but marking body params Private is consistent) - `client_id` = YOUR_GETTY_CLIENT_ID (mark **Private**) - `client_secret` = YOUR_GETTY_CLIENT_SECRET (mark **Private**) ```json { "method": "POST", "url": "https://authentication.gettyimages.com/oauth2/token", "body_type": "form-urlencoded", "body": { "grant_type": "client_credentials", "client_id": "<private: YOUR_CLIENT_ID>", "client_secret": "<private: YOUR_CLIENT_SECRET>" } } ``` Click **Initialize call**. If your credentials are approved and correct, Getty returns: ```json { "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...", "token_type": "Bearer", "expires_in": 1800 } ``` Bubble detects the `access_token`, `token_type`, and `expires_in` fields. Now build the **token storage workflow**: go to your Bubble Workflow editor. Create an API workflow or a page-load workflow that: 1. Calls the **Get Access Token** action 2. After the call succeeds, uses **Make changes to a Thing** targeting the App Settings record to: - Set `getty_access_token` = result of Step 1's `access_token` - Set `getty_token_expires_at` = Current date/time + 1800 seconds (use Bubble's date arithmetic: Current date/time + 0 hours 30 minutes) This workflow must run before any image search calls. Build it now so you can trigger it manually in the next step.
1{2 "method": "POST",3 "url": "https://authentication.gettyimages.com/oauth2/token",4 "headers": {5 "Content-Type": "application/x-www-form-urlencoded"6 },7 "body_form_urlencoded": {8 "grant_type": "client_credentials",9 "client_id": "<private: YOUR_CLIENT_ID>",10 "client_secret": "<private: YOUR_CLIENT_SECRET>"11 }12}Pro tip: If the Initialize call returns a 400 Bad Request error, double-check that the Body type is set to 'Form-urlencoded' — NOT 'JSON'. Getty's token endpoint requires form-encoded body parameters, not a JSON body. Sending JSON to this endpoint returns a 400 even with correct credentials.
Expected result: The Initialize call succeeds and returns an access_token, token_type, and expires_in fields. Bubble detects these three fields. A workflow exists that calls Get Access Token and stores the result in the App Settings record.
Add the Getty Images search API group with dynamic Bearer token
Create a second API Connector group for the actual image search calls. In the API Connector panel, click **Add another API** and name it `Getty Images API`. Set **Authentication** to **No authentication**. Under **Shared headers**, click **Add a shared header**: - **Name**: `Authorization` - **Value**: `Bearer ` followed by the dynamic token from App Settings - Use Bubble's **Insert dynamic data** to bind the value: `Bearer [App Settings's getty_access_token]` - **Tick the Private checkbox** — this ensures the Bearer token is never sent to the browser Also add a header: - **Name**: `Api-Key` - **Value**: your Getty client_id (mark **Private**) — some Getty API endpoints require this alongside the Bearer token Now add the image search call: - **Name**: `Search Images` - **Use as**: **Data** - **Method**: GET - **URL**: `https://api.gettyimages.com/v3/images/search` URL parameters: - `phrase` — the search keyword (bind to a Bubble Input element) - `fields` = `id,title,caption,display_sizes,asset_family,artist,collection_name` (comma-separated list of fields to return) - `asset_family` = `creative` (or `editorial`, or omit for both) - `page_size` = `25` - `page` = `1` (bind to a Custom State for pagination) - `sort_order` = `best_match` - `orientations` = `horizontal` (optional) ```json { "method": "GET", "url": "https://api.gettyimages.com/v3/images/search", "shared_headers": { "Authorization": "Bearer <dynamic: App Settings getty_access_token>", "Api-Key": "<private: YOUR_CLIENT_ID>" }, "params": { "phrase": "<dynamic:search_phrase>", "fields": "id,title,display_sizes,asset_family,artist", "asset_family": "creative", "page_size": "25", "page": "<dynamic:page_number>" } } ``` First, **manually trigger the token storage workflow** from Step 3 to populate the App Settings record with a real token. Then click **Initialize call** on the Search Images call. Getty returns a response with an `images` array. Set the **Data path** to `images`. Bubble detects image fields including `id`, `title`, `caption`, `artist`, `asset_family`, `collection_name`, and the nested `display_sizes` array.
1{2 "method": "GET",3 "url": "https://api.gettyimages.com/v3/images/search",4 "shared_headers": {5 "Authorization": "Bearer <dynamic: App Settings getty_access_token>",6 "Api-Key": "<private: YOUR_CLIENT_ID>"7 },8 "call_params": {9 "phrase": "<dynamic:search_phrase>",10 "fields": "id,title,display_sizes,asset_family,artist,collection_name",11 "asset_family": "creative",12 "page_size": "25",13 "page": "<dynamic:page_number>",14 "sort_order": "best_match"15 }16}Pro tip: If the Initialize call returns 401 Unauthorized, the token in App Settings may be expired or empty. Manually run the token acquisition workflow first, verify the getty_access_token field is populated in the App Settings record (check in Bubble's Data tab), then retry the Initialize call.
Expected result: The Initialize call succeeds. Bubble detects the images array fields including id, title, display_sizes (a nested array), asset_family, and artist. Data path is set to 'images'. The Repeating Group can now be bound to this call.
Build the token refresh Backend Workflow (paid plan) and the image display UI
**Token Refresh Backend Workflow (paid Bubble plan):** Go to **Backend Workflows** in your Bubble editor (left menu). Create a new API Workflow named `Refresh Getty Token`. In this workflow: 1. Add the **Getty Token - Get Access Token** API action call 2. After success, **Make changes to a Thing** on the App Settings record: - `getty_access_token` = Step 1's `access_token` - `getty_token_expires_at` = Current date/time + 29 minutes (slightly less than 30 to add buffer) 3. Finally, add a **Schedule API Workflow** action that schedules another run of `Refresh Getty Token` 25 minutes in the future — this creates a self-recurring refresh loop To start the loop: on your app's admin page or on the first page load (conditionally when `App Settings's getty_token_expires_at` is before `Current date/time`), trigger `Refresh Getty Token` once. It will then continue refreshing itself every 25 minutes. RapidDev's team has implemented this exact OAuth token refresh loop in Bubble for many external API integrations — if your Getty integration is part of a larger editorial platform, book a free scoping call at rapidevelopers.com/contact. **Image Search UI:** Create a new Bubble page (e.g., `getty-picker`). Add: 1. **Search Input**: placeholder 'Search Getty Images...' bound to a Custom State `search_phrase` 2. **Asset Family Dropdown**: static choices `creative` and `editorial` 3. **Repeating Group**: - Type of content: `Getty Images API - Search Images` - Data source: `Get data from external API` → `Getty Images API - Search Images` - Bind `phrase` to the `search_phrase` Custom State (with 500ms debounce) - Bind `asset_family` to the Dropdown value - Set Data path to `images` (already configured in the call) 4. **Inside the Repeating Group cell**: - **Image element**: to show the Getty watermarked preview, navigate to `Current cell's display_sizes:filtered by name = thumb:first item's uri` - **Text label**: 'WATERMARKED PREVIEW — FOR SELECTION ONLY' (important legal label) - **Text element**: `Current cell's title` - **Text element**: `Current cell's artist` - **Button 'Save to Board'**: stores `current cell's id`, `current cell's title`, and the thumb URI to a database record 5. **Privacy rules**: set privacy rules on any data type that stores Getty image IDs and URIs — restrict access to logged-in users with the appropriate role.
Pro tip: Getty's display_sizes array contains objects with 'name' and 'uri' fields. In Bubble's filter expression, use ':filtered by name = thumb' to get the thumb preview, or 'comp' for the watermarked full-resolution preview. The 'comp' size is the large watermarked image Getty provides for selection; displaying 'comp' images in published content without a license is a terms of service violation.
Expected result: The Refresh Getty Token Backend Workflow runs every 25 minutes and keeps the App Settings token fresh. The image search UI shows Getty watermarked previews in a Repeating Group with title, artist, and a Save to Board action. Token expiry no longer causes mid-session failures in production.
Handle display_sizes navigation and add the detail asset call
Getty's `display_sizes` field is a list of objects — not a flat URL string. Each element in the list has a `name` (identifying the size) and a `uri` (the URL). The available names include: `thumb` (small thumbnail), `comp` (full-size watermarked), `preview` (medium watermarked), and `highres` (licensed full-resolution, only accessible with an active commercial license). In Bubble, navigating to a specific size variant from a Repeating Group cell uses the **:filtered** constraint: `Current cell's Search Images's display_sizes:filtered by name = thumb :first item's uri` Add an Image element inside the Repeating Group and set its Source to this filtered expression. If Bubble's field picker does not show `display_sizes` as a list of items, the Initialize call may have detected it as a single object rather than a list — re-initialize the search call against a result that includes multiple display_sizes entries. **Adding a detail call for individual assets:** For a click-through detail view, add a second call in the Getty Images API group: - **Name**: `Get Image` - **Method**: GET - **URL**: `https://api.gettyimages.com/v3/images/{id}` (with `{id}` as a dynamic URL segment) - **URL param**: `fields=id,title,caption,display_sizes,artist,asset_family,keywords,collection_name` - **Use as**: Action (or Data for a preview popup) When the user clicks a Repeating Group item, pass `current cell's id` to a popup or detail page. That page calls `Get Image` with the passed ID to fetch full metadata including all available display_sizes variants. ```json { "method": "GET", "url": "https://api.gettyimages.com/v3/images/<dynamic:image_id>", "headers": { "Authorization": "Bearer <dynamic: App Settings getty_access_token>", "Api-Key": "<private: YOUR_CLIENT_ID>" }, "params": { "fields": "id,title,caption,display_sizes,artist,asset_family,keywords" } } ``` The detail call returns a single image object (not wrapped in an array) — do not set a Data path. Use as an Action and read the response fields in the next workflow step.
1{2 "method": "GET",3 "url": "https://api.gettyimages.com/v3/images/<dynamic:image_id>",4 "shared_headers": {5 "Authorization": "Bearer <dynamic: App Settings getty_access_token>",6 "Api-Key": "<private: YOUR_CLIENT_ID>"7 },8 "call_params": {9 "fields": "id,title,caption,display_sizes,artist,asset_family,keywords,collection_name"10 }11}Pro tip: If the display_sizes filtered expression returns empty or blank in your Image element, check whether Bubble's Initialize call detected display_sizes as a list. Open the API Connector call settings — if display_sizes shows as a single object instead of a list, click the circular arrow icon next to the field to toggle it to 'list'. Re-save and re-initialize if needed.
Expected result: Image elements in the Repeating Group show Getty watermarked thumbnail previews via the display_sizes filtered expression. The detail Get Image call returns full metadata for a selected asset. The integration is functionally complete.
Common use cases
Internal editorial image search and approval board
A media company builds a Bubble app for its editorial team to search Getty Images, curate image candidates for upcoming articles, and get manager approval before purchasing licenses. Editors search by keyword and asset family (creative vs editorial), save selected image IDs and preview URIs to a Bubble 'Image Board' data type, add notes and article associations, then a manager approves selected images for licensing purchase through Getty's licensing portal. The Bubble app streamlines the curation workflow without requiring every editor to have Getty Admin access.
Build a Bubble editorial image curation app. Include a search page where editors enter keywords and select an asset family (creative or editorial). Display Getty Images search results in a masonry grid with watermarked previews. Let editors click 'Save to Board' to add an image (storing its ID, title, and display_sizes thumb URI) to an Image Board record linked to a specific Article. Include a Board review page where managers can approve or reject saved images.
Copy this prompt to try it in Bubble
Getty image picker for a content publishing platform
A Bubble content platform for journalists includes a Getty Images picker in the article editor. When an author clicks 'Add Getty Image', a popup opens with a Getty search interface — keyword input, orientation filter, and a grid of watermarked previews. The author selects an image to use as the article's header photo; the Bubble app stores the Getty image ID and comp URI as a pending asset reference. The ops team later handles actual licensing through Getty's portal before the article goes live.
Create a Bubble article editor popup that allows journalists to search Getty Images using keywords and orientation filters. Show watermarked preview images in a grid labeled 'Preview Only — Licensing Required'. Let the author select one image per article, storing the Getty image ID and display_sizes comp URI in the Article record's pending_getty_image field.
Copy this prompt to try it in Bubble
Brand asset tracking dashboard with Getty licenses
A brand team builds a Bubble asset tracker that maps their existing Getty Images licenses to their content projects. The Bubble app uses the Getty API to fetch metadata for specific image IDs (title, keywords, artist, collection), displays the licensed images in a searchable internal library, and tags each image with the campaigns or projects it is approved for use in. This prevents license misuse and gives the team a visual record of what Getty assets are cleared for publication.
Build a Bubble brand asset library that fetches metadata for a list of Getty image IDs. For each ID, call GET /v3/images/{id} to retrieve title, artist, collection, and display_sizes. Display the results in a searchable Repeating Group where each item shows the watermarked preview, title, and a tags field where the team can note approved projects.
Copy this prompt to try it in Bubble
Troubleshooting
Initialize call on the token endpoint returns 400 Bad Request
Cause: The Body type for the token acquisition call is set to JSON instead of Form-urlencoded. Getty's authentication endpoint requires application/x-www-form-urlencoded encoding, not JSON.
Solution: Open the Getty Token - Get Access Token call in the API Connector. Change the Body type from 'JSON' to 'Form-urlencoded'. Re-enter the body parameters (grant_type, client_id, client_secret) as form fields. Click Initialize call again.
Image search returns 401 Unauthorized mid-session after working initially
Cause: The OAuth access token stored in App Settings has expired (tokens expire after 30 minutes). If no scheduled token refresh is running, the token becomes stale and Getty rejects all API calls.
Solution: Trigger the Refresh Getty Token Backend Workflow manually to get a fresh token. For production, implement the self-recurring scheduled Backend Workflow described in Step 5 (requires a paid Bubble plan). On the Free plan, add a page-load condition that checks if App Settings's getty_token_expires_at is less than Current date/time and triggers the token refresh workflow if so.
Bubble shows 'There was an issue setting up your call' on the Search Images Initialize
Cause: The search call's Authorization header contains the placeholder text instead of a real token, OR the App Settings record is empty (no token stored yet), OR the API call itself is being rejected by Getty due to missing credentials.
Solution: First, manually run the token acquisition workflow and verify in the Bubble Data tab that App Settings's getty_access_token is populated with a real token string. Then re-attempt the Initialize call. If it still fails, temporarily paste the token value directly into the Authorization header field (as a fixed value instead of a dynamic binding) to confirm the header format is correct, then switch back to the dynamic binding.
Repeating Group image thumbnails are blank or show broken image icons
Cause: The Image element's Source is bound to the wrong field or the display_sizes filtered expression is not correctly navigating to the uri of the thumb variant.
Solution: Check the Image element's Source binding: it should navigate Current cell's Search Images's display_sizes, filtered by name = thumb, first item, uri. If 'display_sizes' does not appear as a list in Bubble's field picker, open the API Connector call and toggle the display_sizes field type from 'object' to 'list of objects' (the circular arrow icon). Re-save and retry.
Getty API access request has not been approved after 3+ business days
Cause: Getty's approval team may need additional information about your use case or the application is pending review.
Solution: Log into developers.gettyimages.com and check your application status. If it shows 'Pending', send a follow-up email to the developer support contact listed in the portal with your application name and ID. Include a more detailed description of your editorial use case and the type of Bubble app you are building. Approvals for internal editorial tools with clear commercial context are typically faster than vague developer demo requests.
Best practices
- Mark both client_id and client_secret as Private in the API Connector body parameters. These credentials identify your Getty developer application — if exposed, they could be used by others to consume your API quota. Bubble's Private flag keeps them server-side and out of browser network logs.
- Store the token expiry timestamp alongside the access token in App Settings. Always check getty_token_expires_at before making search calls — if the token expires in less than 2 minutes, trigger the refresh before proceeding. This prevents the 1-in-30-minute failure that happens exactly when users are actively searching.
- Never display Getty 'comp' (watermarked full-resolution) images in your app without a clear 'Watermarked Preview — Not for Publication' label. Getty actively monitors for unauthorized use of comp images and will pursue licensing violations. Always make it visually obvious that displayed images are previews only.
- Separate your Getty search UI and your licensing workflow clearly. The Bubble app handles search and curation; Getty's own portal or a commercial API agreement handles actual licensing and download. Do not attempt to proxy Getty's licensed download endpoint through Bubble.
- Set privacy rules on Bubble data types that store Getty image IDs and URIs. Even though Getty asset IDs are not secret, stored search results and curated boards may contain contextual information (article assignments, editorial notes) that should be restricted to team members.
- Use the 'fields' URL parameter to request only the Getty response fields you need. The default response without a fields parameter returns many metadata fields including rights information, pricing data, and extended attribution — a much larger payload than necessary for a simple image picker. Specifying 'id,title,display_sizes,artist' reduces response size and Bubble Workload Unit cost.
- For production apps with multiple concurrent users, implement a proactive token refresh that runs every 25 minutes regardless of user activity. A reactive refresh (checking on each API call) creates a gap: if two users both need a token refresh simultaneously, one request may fail before the refresh completes.
- Test your integration thoroughly with both 'creative' and 'editorial' asset families. Editorial images (news photography, sports events, celebrity photos) have stricter licensing requirements than creative assets and cannot be used in commercial advertising contexts even with a general Getty license. Your Bubble UI should communicate this distinction to users.
Alternatives
Pixabay is completely free, requires no application approval, and uses a single API key with no token expiry. Getty is the right choice for professional editorial and commercial photography with premium asset quality; Pixabay is the right choice for apps needing royalty-free stock without any licensing overhead or approval process.
Shutterstock offers instant developer access (no application review), a Basic Auth path for search without OAuth token management, and a 450M+ asset library. Getty is stronger for editorial news photography and has a more established commercial licensing framework; Shutterstock is easier to set up and supports images, video, and music.
Adobe Creative Cloud's API focuses on design tools and asset creation/export rather than stock photography search. Getty is the choice for sourcing and curating photojournalism and stock photography; Adobe CC is the choice for generating or customizing visual design assets in a Bubble app.
Frequently asked questions
Can I start building the integration before Getty approves my API access?
Yes — and you should. Use the waiting period to create the App Settings data type, install the API Connector, configure the token acquisition call structure (using placeholder credentials), design your image search UI, and build the token refresh Backend Workflow. Everything except the Initialize calls can be completed before approval. Once credentials arrive, insert them, run the Initialize calls, and the integration is live.
Do I need a paid Getty Images subscription to use the API?
Getty Images API access is separate from a content license. You can search and display watermarked preview images (comp images) with API access alone. Commercially licensing and downloading full-resolution images for use in your Bubble app or published content requires a Getty Images licensing agreement — either a per-image purchase or a subscription. Check with Getty's sales team for licensing options appropriate to your use case.
Does Getty Images API work on Bubble's Free plan?
Partial functionality works on the Free plan. The token acquisition call, image search, and display all work on Free. What does not work on Free is the scheduled Backend Workflow for automatic token refresh — on Free, you must refresh the token manually or on page load. For a prototype or internal tool with infrequent use, this is acceptable. For a production app with continuous usage, a paid Bubble plan is necessary.
What is the difference between 'creative' and 'editorial' Getty assets?
Creative assets are cleared for commercial use — advertising, marketing, product promotion, and similar commercial contexts. Editorial assets (news photography, sports events, celebrity photos) are cleared for news reporting, editorial commentary, and educational use only — they cannot be used in advertising or commercial promotional content. This distinction affects both your licensing agreement with Getty and how your Bubble app should present and restrict asset usage. Always label assets clearly and confirm licensing coverage before using editorial images in commercial contexts.
Can I cache Getty search results in Bubble's database to reduce API calls?
Yes, and it is a good practice for reducing Workload Units and API call frequency. Store search results (image ID, title, thumb URI, asset_family) in a Bubble data type with a 'search_term' field and a 'cached_at' timestamp. Before making a live API call, check whether a cached result for the same search term exists and is less than 1 hour old. If so, display cached results. This significantly reduces API calls for repeated searches of common terms like 'business' or 'technology'.
The display_sizes field in Bubble's API Connector shows as a single object, not a list. How do I fix this?
This is a common Bubble API Connector detection issue with nested arrays. Open the Search Images call in the API Connector, find the display_sizes field in the detected response fields list, and look for a circular arrow or toggle icon next to it. Click it to switch the field type from 'object' to 'list of objects'. Save the call and re-initialize. After the type change, Bubble correctly treats display_sizes as an iterable list that you can filter by name to extract specific size URIs.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation